一道动态规划的题,和NYOJ上的一道题一样,直接贴的代码水过。。。。。。。。。题目:
E 最大矩阵
Accept:36 | Submit:61 |
Time Limit:1000MS | Memory Limit:65536KB |
Description
找出一个子矩阵,在这个子矩阵中所有数的和最大。
例如下面矩阵
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
的最大子矩阵为
9 2
-4 1
-1 8
它的所有数的和为15。
Input
输入有多组数组
每组数组的第一行为n,1<=n<=100。
接下来有n*n个整数,每个数大小范围为[-127,127]。
Output
每组数组输出一行
数组最大子矩阵的所有数的和。
Sample Input
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
Sample Output
15
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
//freopen("1.txt","r",stdin);
int kk;
int n;
while(scanf("%d",&n)&&n)
{
int a[105][105],b[105],max=-10000000,sum,flag;
int m;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
//cin>>m>>n;
m=n;
int i,j;
for(i=1;i<=m;++i)
{
for(j=1;j<=n;++j)
cin>>a[i][j];
}
for(i=1;i<=m;++i)
{
for(j=i;j<=m;++j)
{
sum=0;flag=0;
for(int k=1;k<=n;++k)
{
b[k]+=a[j][k];
}
for(int t=1;t<=n;++t)
{
if(sum+b[t]>=0) sum+=b[t];
else {flag=1;sum=b[t];}
if(sum>max) max=sum;
if(flag) {flag=0;sum=0;}
}
}
memset(b,0,sizeof(b));
}
cout<<max<<endl;
}
}