题意:给你n个数,你可以选3堆,每堆最多连续选m个,问选择结果最优解
思路:dp[i][j]=max(dp[k][j-1]+sum[k]-sum[i],dp[i-1][j])
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 50010
int dp[MAXN][4],num[MAXN],sum[MAXN];
int main(int argc, char** argv) {
int t,n,i,j,k,m;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
scanf("%d",&m);
sum[0]=0;
for(i=1;i<=n;i++)
sum[i]=sum[i-1]+num[i];
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++){
for(j=1;j<=3;j++){
k=i-m;
if(k<0)
k=0;
dp[i][j]=max(dp[k][j-1]+sum[i]-sum[k],dp[i-1][j]);
}
}
printf("%d\n",dp[n][3]);
}
return 0;
}