HDU 3008 dp打怪血量 三重循环调二维背包或一维

点击打开链接

题意:人有100血和100魔法,每秒增加 t 魔法(不能超过100)。n个技能,每个技能消耗a[i]魔法值,造成b[i]伤害。普通攻击不消耗魔法,每秒1伤害。

boss有100血,每秒对人造成q伤害。每秒内,人先攻击,boss后攻击。问最少多少秒杀死boss?

分析:boss对人每秒q伤害,人的死亡时间是确定的,T = 100/q + ( 100%q?1:0 )。

普通攻击可看作a=0   b=1的技能。

dp(i, j)表示第i秒,魔法值j,boss的最少血量。    dp(i, jj) = min dp(i-1, j) - b[k]     jj = min(  j-a[k]+t, 100 )

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int mp,hp;
}a[1000];
int dp[2100][1000];
int main()
{
    int n,t,m;
    while(~scanf("%d%d%d",&n,&t,&m))
    {
        if(!n&&!m&&!t)break;
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&a[i].mp,&a[i].hp);
        }
        a[n+1].hp=1,a[n+1].mp=0;
        int time=100%m?100/m+1:100/m;
        int flag=0;
        for(int i=1;i<=time;i++)
        {
            for(int j=1;j<=n+1;j++)
            {
                for(int k=100;k>=a[j].mp;k--)      ///二维背包
                {
                    dp[i][k]=max(dp[i][k],dp[i-1][k-a[j].mp+t]+a[j].hp);
                    if(dp[i][k]>=100)
                    {
                        flag=i;break;
                    }
                }
                if(flag)
                    break;
            }
            if(flag)
                break;
        }
        if(flag)
        printf("%d\n",flag);
        else
            printf("My god\n");
    }
    return 0;
}


你可能感兴趣的:(HDU 3008 dp打怪血量 三重循环调二维背包或一维)