您的位置:首页 > 其它

poj1050最大子矩阵和

2012-03-11 18:46 232 查看
这周准备狂做dp题,尽管目前还是很弱,但是自己给自己鼓劲吧,每天做好的题目最好都能写写解题报告,虽然乍看起来,很是浪费时间,但是还是养成一个习惯吧!为后面更多的难题做准备!

此题为dp第5题,poj1050,

// b[i][j]表示从1...i行,第j列的和

/*在这里其实只要压缩数组就行了,那么如何压缩呢,b[i][j]-b[k][j] 1<=k<=i-1 此时对

于每个k,都有相应的j列组成一个数组,在这个数组里,在用一维的求最大值即可



我们要做的就是要循环k次,其中对于这每一个k,总共有j列,其中k又有从1...i-1种可能,

而i的取值范围又是 从1...n 初始的时候,其中s[0][j] 对于0行的没个j列都为0



那么这个循环可以这样写:

for(int i=1;i<=n;i++)

for(int k=1;k<=i-1;k++)

{

sum=0;

for(int j=1;j<=n;j++)

{

sum+=(b[i][j]-b[k][j]);

if(sum>max)

max=sum;

if(sum<0)

sum=0;

}

}

*/

#include<iostream>

#include<string>

#define minest -100000

using namespace std;

int main()

{

int n;

int a[102][102];

int b[102][102];

int sum,maxsum;

cin>>n;

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

cin>>a[i][j];

memset(b,0,sizeof(b));

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

for(int k=1;k<=i;k++)

b[i][j]+=a[k][j];

maxsum=minest;

for(int i=1;i<=n;i++)

for(int k=1;k<=i-1;k++)

{

sum=0;

for(int j=1;j<=n;j++)

{

sum+=(b[i][j]-b[k][j]);

if(sum>maxsum)

maxsum=sum;

if(sum<0)

sum=0;

}

}

cout<<maxsum<<endl;

//system("pause");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: