hdu1024
dp,滚动数组优化
方程:
f[i][j]=max(f[i−1][j−1],f[i][k])+num[j];(k=1,2,...,j−1)
—>f[i][j]=max(f[i−1][j−1],f[i][j−1])+num[j]
方程(滚动数组):
f[1][i]=max(f[1][i−1],f[0][i−1])+num[i];
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1000005;
const int inf=0x3f3f3f3f;
int num[maxn];
int f[2][maxn];
int main()
{
int n,m;
while(cin>>m>>n)
{
int ans;
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
memset(f,0,sizeof(f));
for(int i=1;i<=m;i++)
{
ans=-inf;
for(int j=i;j<=n;j++)
{
f[1][j]=max(f[1][j-1],f[0][j-1])+num[j];
f[0][j-1]=ans;
ans=max(ans,f[1][j]);
}
}
cout<<ans<<endl;
}
return 0;
}