hdu 1081 (最大子段和的升级版,二维)

来源:互联网 发布:手机联系人同步软件 编辑:程序博客网 时间:2024/05/21 12:40

点击打开链接


一维最大字段和:dp [ i ] = max ( dp[ i-1 ]  , 0 ) + a [ i ] ;

如果是二维的话,可以变成一维的用map [ i ] [ j ] 表示第 i 行前 j 个元素的和,dp [ k ] [ i ] (l 表示j) 表示到第 k 行 第 i 列的最大值

则dp [ k ] [ i ] = max ( map [ k ] [ i ] - map [ k ] [  j -1 ] , 0 )  , ( j <= i ) .


#include"stdio.h"#include"string.h"int main(){int n;int i,j,a;int ans,t,k;int map[101][101];while(scanf("%d",&n)!=-1&&n){memset(map,0,sizeof(map));for(i=1;i<=n;i++){for(j=1;j<=n;j++){scanf("%d",&a);//map[i][j]表示第i行前j个元素的和map[i][j]=map[i][j-1]+a;}}ans=-999999999;for(i=1;i<=n;i++){for(j=1;j<=i;j++){t=-1;for(k=1;k<=n;k++){//t表示到k行时,第j列到第i列的最大值if(t>0)t+=map[k][i]-map[k][j-1];else t=map[k][i]-map[k][j-1];if(t>ans)ans=t;}}}printf("%d\n",ans);}return 0;}