题目意思就不说了:
用dp[i][j]表示第i秒攻击,剩余魔法为j的时候,对boss造成的最大伤害.
a[i]保存技能i对应的魔法消耗,b[i]表示技能i对应的魔法攻击力;
那么在第i次时,攻击之后,剩余的魔法为int tmp=j-a[k]+t;如果大于100,则取100;
而这时对boss的最大伤害为dp[i][tmp]=max(dp[i][tmp],dp[i-1][j]+b[k]);
#include <cstdio> #include <cstring> #include <iostream> using namespace std; int a[111],b[111]; int dp[111][111];//第i次攻击,剩余j magicvalue的最大伤害; int main() { int i,j,k,l,m,n; int t,q ; while(cin>>n>>t>>q) { m=0; if(n==0&&q==0&&t==0) { break; } for(i=1;i<=n;i++) { cin>>a[i]>>b[i]; } a[n+1]=0; b[n+1]=1; if(100%q) { l=100/q+1; } else l=100/q; memset(dp,0,sizeof(dp)); for(i=1;i<=l;i++) { for(j=100;j>=0;j--) { for(k=1;k<=n+1;k++) { int tmp=j+t-a[k]; if(j-a[k]<0) continue; if(tmp>=100) tmp=100; dp[i][tmp]=max(dp[i][tmp],dp[i-1][j]+b[k]); if(dp[i][tmp]>=100) { m=1; break; } } if(m) { break; } } if(m) { break; } } if(m) cout<<i<<endl; else cout<<"My god"<<endl; } }
注意状体转移方程中是dp[i][tmp]=max(dp[i][tmp],dp[i-1][j]+b[k])而不是dp[i][j]=max(dp[i][j],dp[i-1][j]+b[k]);
dp[i][j]代表的是第i秒时,还具有的魔法,这个魔法肯定是由i-1秒攻击之后得来,所以,第i秒攻击之后,魔法就为tmp=min(100,j-a[k]+t);也即为i+1秒时所具有的魔法值