HDU 1081 To The Max

#include<iostream> using namespace std; #define M 100 #define LIMIT -128 /* ashione 2011-6-18 HDU 1081 简单DP 这个题的状态转移方程不好解释。 就是前面 || num[i][j]代表第i行前j个数据的和 || ,其它的不像DP。 那么又num[i][j] 可得 sum[k][1ong]=num[i][j]-num[i][i-1]; 其中 long = j-i+1 sum[k][long]代表的是 第k行,从第i个开始 到第j个 长度为 long的和。 又因为循环是连续的,所以当long固定时 一个 子矩阵和就为 sum[k][long]其中k= 1->n; 由上可得 MatrixMaxsum=MAX( SUM(sum[k][long]) ) 其中 k = 1->n ,long =1->n; 但是此题无需保存所有子矩阵和 所以 用一个sum 代替便可。 还有,个人认为应该还有更优的解法。 */ int main(){ int n; while(cin>>n){ int data,num[M+1][M+1]={0}; int i,j,k,max=LIMIT,sum=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>data,num[i][j]+=data+num[i][j-1]; for(i=1;i<=n;i++) for(j=i; sum=0 || j<=n;j++){ for(k=1;k<=n;k++){ sum<0?sum=0:1; sum+=num[k][j]-num[k][i-1]; max=max>sum?max:sum; } } cout<<max<<endl; } return 0; }

你可能感兴趣的:(HDU 1081 To The Max)