题目链接:http://poj.org/problem?id=1976
分析对了,但是敲代码的时候糊涂了,一直细节没弄好,WA了n次啊!
#include<iostream>
using namespace std;
#define max(a,b) a>b?a:b
int a[50005],v[4][50005],n,m;
void dp()
{
int i,j;
for(j=m; j<=n; j++)
v[1][j]=max(v[1][j-1],v[0][j]);
for(i=2; i<=3; i++)
{
for(j=i*m; j<=n; j++)
{
v[i][j]=max(v[i][j-1],v[i-1][j-m]+v[0][j]);
}
}
/* for(i=0; i<=3; i++)
{
for(j=1; j<=n; j++)
printf("%d ",v[i][j]);
cout<<endl;
}*/
printf("%d\n",v[3][n]);
}
int main()
{
int T,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=1; i<=n; i++)
scanf("%d",&a[i]);
scanf("%d",&m);
if(n<=m*3)
{
int sum=0;
for(i=1; i<=n; i++)
sum+=a[i];
printf("%d\n",sum);
continue;
}
memset(v,0,sizeof(v));
v[0][m]=0;
for(j=1; j<=m; j++)
v[0][m]+=a[j];
for(i=m+1; i<=n; i++)
v[0][i]=v[0][i-1]+a[i]-a[i-m];
for(i=0; i<m; i++)
v[0][i]=0;
dp();
}
return 0;
}