HNU Sleeping at Work

题意:知道了每个时间段的休息可以获得能量,和连续休息可以获得的能量。求在能休息慢m 分钟,且最长连续时间段不超过 r 所能获得的最大能量值。

分析:dp[i][j][k] 表示到第 i 分钟休息了j 分钟,连续睡了k 分钟获得最大值。

#include<stdio.h>
#include<string.h>
#define max(a,b)(a)>(b)?(a):(b)
#define clr(x)memset(x,0,sizeof(x))
int dp[505][55][55];
int a[505];
int main()
{
    int t,i,j,k,n,m,r;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&r);
        a[0]=0;
        for(i=1;i<=n;i++)
            scanf("%d",&a[i]);
        memset(dp,-1,sizeof(dp));
        for(i=0;i<=n;i++)
            dp[i][0][0]=0;
        for(i=1;i<=n;i++)
            for(j=1;j<=m&&j<=i;j++)
            {
                for(k=1;k<=r&&k<=j;k++)
                {
                    if(dp[i-1][j-1][k-1]==-1)
                        dp[i][j][k]=-1;
                    else 
                        dp[i][j][k]=dp[i-1][j-1][k-1]+k*a[i];
                    if(dp[i-1][j][k]>dp[i][j][0])
                        dp[i][j][0]=dp[i-1][j][k];
                }
                dp[i][j][0]=max(dp[i][j][0],dp[i-1][j][0]);
            }
        int res=-1;
        for(k=0;k<=r;k++)
            res=max(res,dp[n][m][k]);
        if(res==-1)
            printf("impossible\n");
        else printf("%d\n",res);
    }
    return 0;
}

 

posted @ 2012-09-02 14:18  'wind  阅读(180)  评论(0编辑  收藏  举报