hdu 1081 To The Max最大连续子串和

来源:互联网 发布:神奇表盘 网络错误 编辑:程序博客网 时间:2024/05/18 00:19
/* 一维的情况很简单,如何把一维的情况转化为二维情况呢?例如,对于本题的测试数据: 0 -2 -7  0 9  2 -6  2-4  1 -4  1-1  8  0 -2我们可以每次任选几行,压缩成一行,这样就转化为了一维情况。例如,我们求1-2行中的最大子矩阵:即矩阵高为2(1-2行),宽为4的矩阵,可以先把1-2行相加,得到9 0 -13 2,再求这个单行的最大子段,由此就可以求得1-2行的最大子矩阵。*/#include<stdio.h>#include<string.h>int map[110][110],b[110];int dp(int n){int c[110];c[1]=b[1];int i;for(i=2;i<=n;i++)if(c[i-1]>=0)c[i]=c[i-1]+b[i];else c[i]=b[i];int max=c[1];for(i=2;i<=n;i++)if(c[i]>max)max=c[i];return max;}int main(){int n,i,j,k,max,maxx;while(scanf("%d",&n)!=-1){max=-999999999;for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf("%d",&map[i][j]);for(i=1;i<=n;i++){memset(b,0,sizeof(b));for(j=i;j<=n;j++){for(k=1;k<=n;k++)b[k]+=map[j][k];maxx=dp(n);//原先把这两行放到j循环外了max=max>maxx?max:maxx;}}printf("%d\n",max);}return 0;}