您的位置:首页 > 其它

poj 1050 dp

2014-11-30 09:28 169 查看
如题:http://poj.org/problem?id=1050

求n*n子矩阵的和最大。

将每个子矩阵找出来,将子矩阵每一列的和作为一个元素,最终化为线性计算。



#include<iostream>

using namespace std;

#define N 103

int a

;

int dp
; //dp[i][j]是从第下标i,j开始,最大子矩阵的和

int sum;

int a1
;

int main()

{

int i,j;

int n;

// freopen("C:\\1.txt","r",stdin);

scanf("%d",&n);



sum=INT_MIN;

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

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

scanf("%d",&a[i][j]);

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

for(j=i;j<=n;j++)

{

int z,k;

//memset(a1,0,sizeof(a1));

for(k=0;k<=n;k++)

{

a1[k]=dp[k]=0;

}



for(k=1;k<=n;k++)

for(z=i;z<=j;z++)

a1[k]+=a[z][k];

//memset(dp,0,sizeof(dp));



dp[1]=a1[1];

for(k=2;k<=n;k++)

{

/* if(a1[k-1]<0)

dp[k]=0;

else

dp[k]=dp[k-1]+a1[k];*/

dp[k]=(dp[k-1]>0?dp[k-1]:0)+a1[k];

}

for(k=2;k<=n;k++)

{

if(dp[k]<dp[k-1])

dp[k]=dp[k-1];

}

if(sum<dp
)

sum=dp
;

}

printf("%d\n",sum);



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