hdu 3646

DP  状态转移方程还是比较容易想到  关键问题是当前要攻击的怪兽的血量

dp[i][j] = max(dp[i-1][j]+第i只鸟不使用double可杀死的怪兽数, dp[i-1][j-1]+第i只鸟使用double可杀死的怪兽数)

dp[i][j]指前i只鸟使用j次double可杀死的怪兽数

要将m更新为m,n中的较小值 因为最多使用n次double  因为这个一直wa

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int dp[10010][110],rest[10010][110];
int ac[10010],bc[100010],n,m,k;
int cc(int acc, int &bcc, int now)
{
    int flag = 1;
    while(now < k)
    {
        if(acc > bcc)
        {
            acc -= bcc;
            now++;
            bcc = bc[now+1];
            flag = 0;
        }
        else if(acc == bcc)
        {
            now++;
            bcc = bc[now+1];
            break;
        }
        else if(flag)
        {
            bcc -= acc;
            break;
        }
        else
            break;
    }
    return now;
}

int main()
{
    while(scanf("%d%d%d",&n,&m,&k) == 3 && n+m+k)
    {
        for(int i = 1; i <= n; i++)
            scanf("%d",&ac[i]);
        for(int i = 1; i <= k; i++)
            scanf("%d",&bc[i]);
        memset(dp, 0, sizeof(dp));
        m = min(m, n);
        rest[0][0] = rest[0][1] = bc[1];
        for(int i = 1; i <= n; i++)
        {
            int res = rest[i-1][0];
            dp[i][0] = cc(ac[i], res, dp[i-1][0]);
            rest[i][0] = res;
            for(int j = 1; j <= min(m, i); j++)
            {
                int res1 = rest[i-1][j], res2 = rest[i-1][j-1];
                int k1 = cc(ac[i], res1, dp[i-1][j]), k2 = cc(ac[i]*2, res2, dp[i-1][j-1]);
                if(k1 > k2)
                {
                    dp[i][j] = k1;
                    rest[i][j] = res1;
                }
                else if(k1 < k2)
                {
                    dp[i][j] = k2;
                    rest[i][j] = res2;
                }
                else
                {
                    dp[i][j] = k1;
                    rest[i][j] = min(res1, res2);
                }
            }
        }
        printf("%d\n",dp[n][m]);
    }
    return 0;
}


posted @ 2013-10-10 17:36  xlc2845  阅读(142)  评论(0)    收藏  举报