状态压缩DP----HDU2809
状态压缩DP的一道较不错的入门题,第二次做这类问题,感觉不是很顺手,故记录下来.
题目的意思就是吕布战群雄,先给你6个数,分别是吕布的攻击值,防御值,生命值,升级后此三值各自的增量,然后是对手的个数num,接下来是各个对手的名字,攻击值,防御值,生命值,及经验值,规定当吕布经验值每提升100,则攻击值,防御值,生命值加上各自的增量。最后若生命值大于0,输出生命值,否则输出一句话"Poor LvBu,his period was gone."。
刚开始看到此题实在看不出是用压缩DP,以为是普通的DP。但只细一想,状态数太多了并且和编号有关联,原因是:假设与吕布对战的人有三个分别是关羽,张飞,许褚,则现在问题出来了。吕布按什么顺序来对战此三人,吕布-->关羽-->张飞-->许褚,吕布-->张飞-->关羽-->许褚等等,以及战胜一人后生命值是否为零,两人呢.......?这样想着发现很乱很乱,状态多并且不好表示(这不二进制中1正好是状态压缩擅长的嘛)。于是定义状态表达式LvBu[i],i对应的二进制中1代表已和此人对战,如5=101表示分别和关羽,许褚fight了,就差张飞了。但麻烦又来了,101是先和关羽打呢,还是先和许褚打,这里要特别注意的是和谁先打的顺序可能会导致结果不同,例如我先打关羽得到的经验值少不能升级,而我先打许褚升级的经验值就足够了,很明显这两个结果的生命值肯定不会相同。那么怎么解决呢?这只要在for循环时进行更新就可以了
接下来详细解释代码,
#include <iostream>
#include <cstdio> using namespace std; struct Person{
int attck;
int defense;
int hp;
int expirence;
}LvBu[<<],Enemy[],Update;//定义结构体,并分配相应的数组,对手最多20个
int result,num; inline int max(int a,int b) //最大值函数
{
if(a>b) return a;
return b;
} void Fight()
{
int attck,defence;
int myTime,Time;
int rHp,expirence,rattack,rdef;
for(int i=;i<=result;i++)//状态
for(int j=;j<num;j++)//对手编号从0到num-1
{
if(!(i&(<<j))&&LvBu[i].hp>)//若吕布未与编号j对手交战并且生命值不为零,有对战的必要
{
attck=max(,LvBu[i].attck-Enemy[j].defense);//依题目条件吕布攻击一次对方掉attck点血
defence=max(,Enemy[j].attck-LvBu[i].defense);//对方攻击一次吕布掉defence点血
myTime=(LvBu[i].hp+defence-)/defence;//吕布可以攻击的总次数
Time=(Enemy[j].hp+attck-)/attck;//对手可以攻击的总次数
//如关羽生命值是8,吕布攻击一次造成伤害为-3,那么吕布总共可以攻击3次,那么用一行代码如何表示呢?可以先拿1单位的血出来,剩下的直接除以伤害值
if(myTime<Time) continue;//吕布先挂了,否则继续执行
rHp=(LvBu[i].hp-(Time-)*defence);//剩余生命值原本的减去代价值,Time减一的原因是对手先倒下了,原本你打我一下,我打你一下成偶数的,你走的早就打不到我了
expirence=Enemy[j].expirence+LvBu[i].expirence;//得到经验值
rattack=LvBu[i].attck;rdef=LvBu[i].defense;//之所以这样是方便后面书写 if(expirence>=)//可以升级
{
expirence-=;//付出100点经验值为代价
rattack+=Update.attck;
rdef+=Update.defense;
rHp+=Update.hp;
} if(rHp>=LvBu[i|(<<j)].hp)//这就是我先打许褚-->关羽,还是关羽-->许褚的更新了
{
LvBu[i|(<<j)].attck=rattack;
LvBu[i|(<<j)].defense=rdef;
LvBu[i|(<<j)].hp=rHp;
LvBu[i|(<<j)].expirence=expirence;
}
}
}
if( LvBu[result].hp) printf("%d\n",LvBu[result].hp);
else printf("Poor LvBu,his period was gone.\n");
}
int main()
{
while(scanf("%d %d %d %d %d %d",&LvBu[].attck,&LvBu[].defense,&LvBu[].hp,&Update.attck,&Update.defense,&Update.hp)!=EOF)
{ //输入
LvBu[].expirence=;//吕布初始经验值为0
char name[];
scanf("%d",&num);
for(int i=;i<num;i++)
scanf("%s%d%d%d%d",name,&Enemy[i].attck,&Enemy[i].defense,&Enemy[i].hp,&Enemy[i].expirence);
result=(<<num)-;//状态总数 for(int i=;i<=result;i++) LvBu[i].hp=;//初始化
Fight();//对战
}
return ;
}
以后看着复习就省事多了
状态压缩DP----HDU2809的更多相关文章
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- [知识点]状态压缩DP
// 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...
- HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP
题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...
- DP大作战—状态压缩dp
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
- 状态压缩dp问题
问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...
- BZOJ-1226 学校食堂Dining 状态压缩DP
1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...
- Marriage Ceremonies(状态压缩dp)
Marriage Ceremonies Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu ...
- HDU 1074 (状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...
- HDU 4511 (AC自动机+状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...
随机推荐
- mysql编译参数详解
mysql编译参数详解(./configure) 1.--prefix=PREFIX:指定程序安装路径: 2.--enable-assembler:使用汇编模式:(文档说明:compiling i ...
- Java基础知识复习(二)
Java 重写(Override)与重载(Overload) 重写 是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变,属于编译时多态.即外壳不变,核心重写! 重写的好处在于子 ...
- Python学习书籍推荐 中英对照
Learn Python The Hard Way 笨办法学 python A Byte of Python 简明Python教程 初学者 英文版 Learning Python, 3rd Editi ...
- Maven引入jar包中的配置文件未被识别
我用的办法是直接将jar包中的配置文件复制出来,粘贴到我自己项目中的配置文件中,讯飞语音的jar包就有这种情况.
- Vue.js:计算属性
ylbtech-Vue.js:计算属性 1.返回顶部 1. Vue.js 计算属性 计算属性关键词: computed. 计算属性在处理一些复杂逻辑时是很有用的. 可以看下以下反转字符串的例子: 实例 ...
- web项目WebContent目录结构参考(WEB-INF)
WEB-INF目录是Java WEB应用的安全目录,客户端(浏览器等)无法访问,只有服务端可以访问.该目录主要用来存放配置文件,如web.xml等. 若是将jsp文件放在WEB-INF目录中,则必须通 ...
- 不同浏览器对于html5 audio标签和音频格式的兼容性
音频格式 Chrome Firefox IE9 Opera Safari OGG 支持 支持 支持 支持 不支持 MP3 支持 不支持 支持 不支持 支持 WAV 不支持 支持 不支持 支持 不支持 ...
- 内网渗透神器xerosploit
项目地址:https://github.com/LionSec/xerosploit 安装完成后直接在终端输入xerosploit打开 显示了本机的内网ip,mac地址,网关,网卡,输入help查看帮 ...
- Django Rest Framework 3
目录 一.版本 二.解析器 三.序列化 四.请求数据验证 一.版本 程序也来越大时,可能通过版本不同做不同的处理 没用rest_framework之前,我们可以通过以下这样的方式去获取. 1 clas ...
- sql数据库各个版本清除日志
SQL2005清空删除日志: 复制代码 代码如下: Backup Log DNName with no_log --'这里的DNName是你要收缩的数据库名,自己注意修改下面的数据 ...