首先是题目描述看得不太懂~~~题意不大好理解~~也就是说有N个分钟..要睡M个分钟..连续的睡的话..1*a[i]+2*a[i+1]..+(k+1)*a[i+k]...但连续的不能超过r....问最大的value...

     显然的dp..我所构造的状态是三维的 ... dp [ i ] [ k ] [ 0 or 1 ]... i 代表当前在第几分钟...k 代表当前睡了多少分钟...0 or 1 , 0代表其是独立不和前后连续的,1反之....那么dp[ ][ ][ ]记录的是这个状态下所能获得的最大value...

     那么更新的时候显然也要分为独立和连续的两种情况来...注意的是更新不连续的时候不能通过i-1来更新....     


Program: 

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<map>
#include<queue>
#include<stack>
#define ll long long
#define oo 1000000000
#define pi acos(-1)
using namespace std;
int t,n,m,r,a[605],dp[605][65][2];
void doit()
{
int i,j,k,h,x,v;
memset(dp,-1,sizeof(dp));
for (i=1;i<=n;i++)
{
dp[i][1][0]=a[i];
for (j=1;j<i-1;j++)
for (k=1;k<m;k++)
{
if (dp[j][k][0]!=-1 && dp[i][k+1][0]<dp[j][k][0]+a[i])
dp[i][k+1][0]=dp[j][k][0]+a[i];
if (dp[j][k][1]!=-1 && dp[i][k+1][0]<dp[j][k][1]+a[i])
dp[i][k+1][0]=dp[j][k][1]+a[i];
}
for (j=1;j<r;j++)
{
h=i-j;
if (h<=0) continue;
v=0; k=1;
for (x=h+1;x<=i;x++) v+=(++k)*a[x];
for (k=1;k<=m-j;k++)
if (dp[h][k][0]!=-1 && dp[i][k+j][1]<dp[h][k][0]+v)
dp[i][k+j][1]=dp[h][k][0]+v;
}
}
x=-1;
for (i=1;i<=n;i++)
for (j=0;j<2;j++)
if (dp[i][m][j]>x) x=dp[i][m][j];
if (x==-1) printf("impossible\n");
else
printf("%d\n",x);
return;
}
int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%d%d%d",&n,&m,&r);
int i;
for (i=1;i<=n;i++) scanf("%d",&a[i]);
doit();
}
return 0;
}