HDU 3008 动态规划(DP) Warcraft

来源:互联网 发布:kruskal算法 详解 编辑:程序博客网 时间:2024/05/21 10:00

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3008

分析:用dp[i][j]表示攻击了i次对其造成j点伤害自身剩余,则有

           dp[i][j+b[k]] = max( dp[i][j+b[k]], dp[i-1][j]-a[i] );

#include<iostream>#include<string>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>#include<iomanip>using namespace std;int dp[105][105];///dp[i][j]表示攻击了i次,打了对方j点生命,自己剩下的魔值int a[105]= {0};int b[105]= {1};int main() {    int n,t,k;    while(cin>>n>>t>>k,n+t+k) {        int m=100/k+(100%k?1:0);        for(int i=1; i<=n; ++i)            cin>>a[i]>>b[i];        memset(dp,-1,sizeof(dp));        dp[0][0]=100;///开始时魔法值为100        for(int i=1;i<=m;++i)            for(int j=0;j<=100;++j)                if(dp[i-1][j]!=-1){                    dp[i-1][j] = (dp[i-1][j]+t)>100 ? 100:dp[i-1][j]+t;///魔值不超过100                    for(int k=0;k<=n;++k)                        if(dp[i-1][j]>=a[k]&&dp[i-1][j]-a[k]>dp[i][j+b[k]])                            if(j+b[k]>=100)                                dp[i][100]=dp[i-1][j]-a[k];                            else                                dp[i][j+b[k]]=dp[i-1][j]-a[k];                }        int p=1;        for( ;p<=m;++p)        if(dp[p][100]!=-1){            cout<<p<<endl; break;        }        if(p>m)puts("My god");    }    return 0;}