1. 程式人生 > >poj1050(動態規劃+最大子矩陣和)

poj1050(動態規劃+最大子矩陣和)

題目要求是輸入一個N*N的矩陣,然後求出這個矩陣的最大子矩陣和,在一維空間中是求最大連續字串和,這題也算是它在二維空間裡的一個擴充套件吧……

這個動歸先求第i行第j列在這一行從1到j的最大字串和,然後,計算這個代表每行最大子串和的矩陣上的每列的最大子串和……

我就在第二個步驟出過問題,好在換了種方法過了……

還是看程式碼吧:

#include <iostream>
#include <cstdio>

using namespace std;

const int maxn=110;

int s[maxn][maxn]={0};
int p[maxn][maxn]={0};

int i,j,k;
int flag;
int n,MAX,sum;

int max(int a,int b)
{return a>b?a:b;}


void dp()
{
	p[1][1]=s[1][1];
	for(i=1;i<=n;++i)
	{
		for(j=1;j<=n;++j)
			p[i][j]=p[i][j-1]+s[i][j];
		}

	for(i=1;i<=n;++i)
     {
          for(j=i;j<=n;++j)
          {
               sum=0;
               for(k=1;k<=n;++k)
               {
                    sum+=p[k][j]-p[k][i-1];
                    if(sum<0) sum=0;
                    MAX=max(MAX,sum);
               }
          }
     }
}
int main()
{

	scanf("%d",&n);
	for(i=1;i<=n;++i)
		for(j=1;j<=n;++j)
		{
			scanf("%d",&s[i][j]);
		}
		dp();

		printf("%d\n",MAX);
	return 0;
}


相關推薦

poj1050(動態規劃+大子矩陣)

題目要求是輸入一個N*N的矩陣,然後求出這個矩陣的最大子矩陣和,在一維空間中是求最大連續字串和,這題也算是它在二維空間裡的一個擴充套件吧…… 這個動歸先求第i行第j列在這一行從1到j的最大字串和,然後

動態規劃 ------大子

動態規劃 函數 cnblogs png 規劃 font 3-9 .cn -- 1.最大子段和的問題描述 2.動態規劃的求解: 3.優化函數的遞推方程 4.動態規劃求解偽碼 5.動態規劃求解的小結: 動態規劃的

LeetCode-初級=動態規劃-大子

給定一個整數陣列 nums ,找到一個具有最大和的連續子陣列(子陣列最少包含一個元素),返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。 進階: 如果你已經實現

POJ-1050 動態規劃大子大子

1、最大子段 由於最大子段不可能以負數或負數段開頭,可以以此得到演算法 int max(int a[],int n) { int sum,maxsum; int i ; sum = maxsum = 0; for(i =

分治法/動態規劃-大子

給定一個整數陣列 nums ,找到一個具有最大和的連續子陣列(子陣列最少包含一個元素),返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。 分治

動態規劃 大子

mes 最小 最大的 iostream ace 動態規劃 strong 最大值 ffffff 子段與子段和的概念:   給定一個由數字組成的序列,其中一段連續的序列稱為一個子段(假設非空),子段中所有的數字和就是為 子段和 例子:    {1,2,3,4} ,  

演算法優化:大子大子矩陣,一維,二維情況分析,動態規劃

最大子段和,前面b[j]理解的是:終點在j的最大連續子段和,及從k:j最大和 是對b[j]進行動態規劃,從k:j最大和:取決於k:j-1的最大和,他大於0的話,就為k:j-1的最大和+arr[j],他小於0的話,就只是arr[j] 終點在j一共有n種情況,原問題只是求b[

poj1050(大子矩陣

algorithm int image bsp color const turn amp div 設a[i][j]表示將矩陣壓縮成線性序列的前綴和 那麽我們在做dp時枚舉起點 i 與終點j 最內層枚舉行號,那麽可以一行一行的累加, 最後更新答案即可 #include&l

大子矩陣poj1050 動規)

題意:給出一個數字矩陣,找出一個子矩陣,使得其中的數字之和最大。 解題思路:這道題是對最大連續子串和的一種擴充套件。解決辦法就是在二維矩陣轉化為多個一維陣列來求最大值。具體來說就是先固定所求子矩陣的左右邊界i和j,然後求出每行從左邊界到右邊界的數之和,這樣每行的和就可以作為

hihocoder 1580 dp大子矩陣

ima freopen tdi com hihocode images namespace ans open 題意: 給出n*m的矩陣求最大子矩陣和,要求必須把矩陣中的某一個元素替換成p 代碼: //求最大子矩陣和,容易想到壓縮之後dp但是這道題要求必須替換一

51Nod 1051 - 大子矩陣(DP)

題目連結 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1051 【題目描述】 一個M*N的矩陣,找到此矩陣的一個子矩陣,並且這個子矩陣的元素的和是最大的,輸出這個最大的值。 例如:3×3的矩陣: -1 3

hdu 1081 (大子矩陣)dp To The Max

Problem Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of

hdu 1081/poj 1050 大子矩陣(dp)

換成谷歌瀏覽器以後終於可以黏貼程式碼了,更新以後的markdown真心難用。。。 dp問題,先把給定的二維矩陣壓縮,變成一維矩陣,如此即可變成hdu1003,用動態規劃的思路求解即可 #include<iostream> #include<cm

大子矩陣---(dp)

題目描述 一個M*N的矩陣,找到此矩陣的一個子矩陣,並且這個子矩陣的元素的和是最大的,輸出這個最大的值。 例如:3*3的矩陣: -1 3 -1 2 -1 3 -3 1 2 和最大的子矩陣是: 3 -1 -1 3 1 2 Input 第1行:M和N,中間用

1634(小的大子矩陣

 寫到要瘋掉,這種需要細節的題目得在精神狀態比較好的時候寫。 #include<iostream> #include<cstdio> #include<algorithm

POJ 1050 / HDU 1081 To the Max(大子矩陣

題目連結: 題意:給出一個n*n的矩陣,正負均有。求一個子矩陣使得該子矩陣的和儘可能的大。 思路:類似於最大子段和,即將前i行至前j行的矩陣壓縮成一行,利用一個數組c,c[k]表示第k列從第i行到第j行的和,接下來只需對陣列c求最大子段和,結果即為第i行到第j行中的最大

動態規劃-小路徑

給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。 說明:每次只能向下或者向右移動一步。 示例: 輸入: [ [1,3,1], [1,5,1], [4,2,1] ] 輸出: 7 解釋:

POJ 1050 To the Max 大子矩陣(二維的大欄位

傳送門: To the Max Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 52306 Accepted: 27646 Description Given a two-dimensional array of positive

hdu1559 大子矩陣

最大子矩陣 Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4459    Accepted Submis

hdu 1081 To The Max(大子矩陣

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7533    Accepted Submission(s)