DP练习1题解F
先上题目描述
咋一看100 貌似能暴力 然而。。。10^12是炸的三次方
很容易想到简化求和的过程做前缀和预处理
用s[i][j]存储i行1-j的元素和 (如此还可以降维妙哉)
我们先用两个循环定下列的范围 如此一来变成了一个一维的DP
考虑如果要加上k行 则 必须要选K-1行 不选的状态只需要和最大值比较就行了
很容易得到如下的处理方法
max=-200;
for (j=1;j<=n;j++)
for (jn=j;jn<=n;jn++)
{
temp=0;
for (i=1;i<=n;i++)
{
inc=s[i][jn]-s[i][j-1];
if (temp<0) temp=inc;else temp=temp+inc;
if (temp>max) max=temp;
}
}
全代码如下
#include<iostream>
#include<cstring>
int s[101][101];
int a[101][101];
using namespace std;
int main()
{
int n,i,j,jn,max,temp,inc;
cin>>n;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
cin>>a[i][j];
s[i][j]=s[i][j-1]+a[i][j];
}
max=-200;
for (j=1;j<=n;j++)
for (jn=j;jn<=n;jn++)
{
temp=0;
for (i=1;i<=n;i++)
{
inc=s[i][jn]-s[i][j-1];
if (temp<0) temp=inc;else temp=temp+inc;
if (temp>max) max=temp;
}
}
cout<<max<<endl;
return 0;
}
以上