传送门http://poj.org/problem?id=1050
将2维的dp压成1维的
将数组每列的和放在一个数组temp中
用temp求最大连续子序列
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 105
using namespace std;
int a[maxn][maxn];
int temp[maxn];
int dp[maxn];
int main()
{
int max=-0x3fffffff;
int n;
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
dp[1]=1;
for(int i=1;i<=n;i++)//从第几行
{
memset(temp,0,sizeof(temp));//注意清零
for(int j=i;j<=n;j++)//到第几行
{
for(int k=1;k<=n;k++)//第几列在temp里的第几个数字
temp[k]+=a[j][k];
int maxx=-0x3fffffff;
int x=temp[1];
for(int i=2;i<=n;i++)
{
if(x<0)
x=temp[i];//sum=0的不是最大子串
//最大子串第一个跟最后一个不是负的
else
x+=temp[i];
if(maxx<x)
maxx=x;//更新最大值
}
if(maxx>max)
max=maxx;
}
}
cout<<max<<endl;
}