hdu-3008魔兽争霸
2015-08-06 21:27
351 查看
这道题目相当有意思,打魔兽对于很多人来说并不陌生,人和boss的hp都是100,人首先攻击,人的普攻为1,有木有这么弱!还好技能是自己输入,不然真的没话说。
好啦,这题就是用动态规划解题,主要还是看状态方程,状态方程不唯一,你可以设f[i][j]表示第i次攻击是剩余蓝量j所造成的最大伤害,也可设第i次攻击所造成的伤害j所消耗的蓝量,反正这道题状态方程不唯一,这是我用第一种状态方程写的,变量有点多,但是找到关键,其实都是浮云。状态方程:f[i][j-a[k]+t]=max(f[i][j-a[k]+t],f[i-1][j]+b[k]);
好啦,这题就是用动态规划解题,主要还是看状态方程,状态方程不唯一,你可以设f[i][j]表示第i次攻击是剩余蓝量j所造成的最大伤害,也可设第i次攻击所造成的伤害j所消耗的蓝量,反正这道题状态方程不唯一,这是我用第一种状态方程写的,变量有点多,但是找到关键,其实都是浮云。状态方程:f[i][j-a[k]+t]=max(f[i][j-a[k]+t],f[i-1][j]+b[k]);
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int f[101][101]; int main() { int n,t,q; int a[101],b[101]; int time; while(cin>>n>>t>>q&&(n+t+q)) { memset(f,-1,sizeof(f));//初始化为-1 for(int i=1; i<=n; i++) { cin>>a[i]>>b[i]; } f[0][100]=0; a[0]=0; b[0]=1; time=100/q;//表示人最多经过几回合 if(100%q!=0) time++; int ans=-1; for(int i=1; i<=time; i++) { for(int j=0; j<=100; j++)//表示剩余蓝量 if(f[i-1][j]!=-1) { for(int k=0; k<=n; k++)//使用技能 { if(j>=a[k])//当前蓝量可支持a[k]技能的释放,进入循环 { f[i][j-a[k]+t]=max( f[i][j-a[k]+t],f[i-1][j]+b[k]);//状态方程 if( f[i][j-a[k]+t]>=100)//所造成伤害超过100,记录是第几回合 { ans=i; break; } } if(ans!=-1) break; } } if(ans!=-1) break; } if(ans==-1) cout<<"My god"<<endl; else cout<<ans<<endl; } return 0; }
相关文章推荐
- 全排列
- UE4 iOS设备的兼容性
- [译]Front-end-Developer-Interview-Questions
- JDK动态代理机制
- java--面向对象(3)--黑马程序员
- Ubuntu Server 14.04 & Apache2.4 虚拟主机、模块重写、隐藏入口文件配置
- Power oj 1782
- 九度oj 1335
- mysql 高可用 1
- C - Valera and Contest题解
- apk文件反编译工具apktool的下载,安装,使用
- [Learning Linux For Fun ] unit 1 1.1
- 网页制作之JavaScript部分3--事件及事件传输方式(函数调用 练习题 )重要---持续更新中
- uva 10670 Work Reduction(贪心)
- 对于HTML的一些不熟悉的及要点掌握
- Web页面优化
- js学习三:操作属性的方法
- Container With Most Water
- 继承BaseAdapter实现Filterable的adapter类完整示例
- 智慧环境