To The Max HDU - 1081
动态规划 最长公共子序列
#include
using namespace std;
int maxnn;
int M[105][105];
int s[105][105]; //记录 第j列 前i行数之和
int n;
void dp(int d ,int cur) //矩阵宽度为d,从第cur开始 dp
{
int max_num;
int sum;
max_num=s[cur+d-1][1]-s[cur-1][1];
sum=s[cur+d-1][1]-s[cur-1][1];
for(int i=2;i<=n;i++)
{
if(sum<0)
{
sum=0;
}
sum+=s[cur+d-1][i]-s[cur-1][i];
if(sum>max_num)
{
max_num=sum;
}
}
if(max_num>maxnn)
{
maxnn=max_num;
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
s[0][i]=0;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&M[i][j]);
s[i][j]=s[i-1][j]+M[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n-i+1;j++)
{
dp(i,j);
}
}
printf("%d",maxnn);
return 0;
}