HDU 3008
2013-08-07 10:57
302 查看
dp题
题意:你有n个技能,每个技能消耗ai点蓝,对boos造成bi点伤害,普攻对boos造成1点伤害,每轮攻击后恢复t点蓝。boos每轮对你造成p点伤害。你的蓝上限,初始血量和boos的初始血量都为100。问,最少多少轮干掉boos(每轮你现攻击,boos再对你攻击),如果不能击败boos,输出My god
dp[i][j]表示当前蓝量为i,第j轮攻击,对boos造成的最大伤害。
那么,
tmp=min(100,j-k+t);
dp[tmp][i]=max(dp[tmp][i],dp[j][i-1]+skill[k]);
题意:你有n个技能,每个技能消耗ai点蓝,对boos造成bi点伤害,普攻对boos造成1点伤害,每轮攻击后恢复t点蓝。boos每轮对你造成p点伤害。你的蓝上限,初始血量和boos的初始血量都为100。问,最少多少轮干掉boos(每轮你现攻击,boos再对你攻击),如果不能击败boos,输出My god
dp[i][j]表示当前蓝量为i,第j轮攻击,对boos造成的最大伤害。
那么,
tmp=min(100,j-k+t);
dp[tmp][i]=max(dp[tmp][i],dp[j][i-1]+skill[k]);
#include<stdio.h> #include<iostream> #include<memory.h> using namespace std; int n,t,q,dp[110][110],skill[110],num,ans; int main() { int a,b,tmp; while(1) { scanf("%d%d%d",&n,&t,&q); if(n==0 && t==0 && q==0) break; memset(skill,0,sizeof(skill)); memset(dp,-1,sizeof(dp)); ans=0; if(100%q) num=100/q+1; else num=100/q; for(int i=0;i<n;i++) { scanf("%d%d",&a,&b); skill[a]=max(b,skill[a]); } skill[0]=1; dp[100][0]=0; for(int i=1;i<=num;i++) { for(int j=0;j<=100;j++) { if(dp[j][i-1]==-1) continue; for(int k=0;k<=j;k++) { if(skill[k]==0) continue; tmp=min(100,j-k+t); dp[tmp][i]=max(dp[tmp][i],dp[j][i-1]+skill[k]); if(dp[tmp][i]>=100) { ans=i; break; } } if(ans!=0) break; } if(ans!=0) break; } if(ans!=0) printf("%d\n",ans); else printf("My god\n"); } return 0; }
相关文章推荐
- hdu 3008 DP
- HDU 3008 Warcraft,动态规划,滚动数组
- hdu 3008 Warcraft(DP)
- HDU 3008 Warcraft DP .
- hdu 3008 Warcraft
- hdu 3008 Warcraft(基础dp题)
- hdu 3008
- hdu 3008:Warcraft(动态规划 背包)
- HDU 3008 dp打怪血量 三重循环调二维背包或一维
- HDU 题目3008 Warcraft
- hdu 3008 Warcraft(dp)
- HDU 3008 Warcraft(dp)
- hdu 3008
- hdu 3008 Warcraft
- hdu-3008魔兽争霸
- HDU 3008 DP
- 【DP】HDU-3008 Warcraft
- hdu 3008 Warcraft
- HDU 3008 Warcraft
- HDU 3008 Warcraft(DP之状态的保存)