POJ 1050 To the Max
传送门http://poj.org/problem?id=1050
做这题的巧妙之处在于把矩阵转化为一维数组,然后求子序列最大和。
如
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
压缩前两行可以得到 9 0 -13 2
#include<cstdio> #include<algorithm> using namespace std; const int MAXN=128; const int MIN_FLAG=-9999; int a[MAXN][MAXN],temp[MAXN]; int n; int getSubSum(const int *a) { int sum=MIN_FLAG,max_sum=MIN_FLAG; for(int i=0;i<n;i++) { if(sum<0) sum=a[i]; else sum+=a[i]; max_sum=max(max_sum,sum); } return max_sum; } int main() { scanf("%d",&n); for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&a[i][j]); int ans=MIN_FLAG; for(int i=0;i<n;i++) //开始行数 { memset(temp,0,sizeof(temp)); for(int j=i;j<n;j++) //结束行数 { for(int k=0;k<n;k++) //列数 temp[k]+=a[j][k]; ans=max(ans,getSubSum(temp)); } } printf("%d\n",ans); }
新 blog : www.hrwhisper.me