一开始觉得应该能用动态规划做,虽然我还没完全弄懂动态规划,但昨天晚上失眠的时候感觉想通了一些。。。就想着能不能在一个点的左上、左、上三个方向上找到状态转移关系,但想了很久都不能找到所谓的重叠子问题。。于是进了死胡同。。。老是这样,一个方向想不出来也不愿放弃转换思路。。。。。
只好看别人的题解,发现这题其实解法还不止一种,甚至可以暴力枚举,不过还是有一种和动态规划沾上边的,就是先枚举,把二维转换成一维,再用动态规划。。。。不知道有没有人能够找到在二维上直接动态规划的。。题目说是NP完全问题,难道已经证明了不可能找到线性时间的解法了吗?算了,这些概念我还没完全弄懂呢。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 110
using namespace std;
int s[MAX][MAX],help[MAX],sum[MAX];
int main()
{
int n,i,j,t,p,maxx;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
scanf("%d",&s[i][j]);
}
maxx=-2000000;
for(i=1;i<=n;i++)
{
for(j=0;j<=n-i;j++)
{
memset(help,0,MAX*4);
for(t=0;t<n;t++)
{
for(p=j;p<j+i;p++)
help[t]+=s[p][t];
}
sum[0]=help[0];
for(t=1;t<n;t++)
{
if(sum[t-1]>0)
sum[t]=sum[t-1]+help[t];
else
sum[t]=help[t];
if(sum[t]>maxx)
maxx=sum[t];
}
}
}
printf("%d\n",maxx);
}
return 0;
}