您的位置:首页 > 其它

hdu 2809(状压dp)

2013-09-10 15:29 363 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809

思路:简单的状压dp,看代码会更明白。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct State{
int ati,def,hp,lev,exp;
}dp[1<<20+2];

struct Node{
int ati,def,hp,exp;
}node[21];

int n;
int In_ati,In_def,In_hp;
char str[22];

int main()
{
while(~scanf("%d%d%d%d%d%d",&dp[0].ati,&dp[0].def,&dp[0].hp,&In_ati,&In_def,&In_hp)){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s%d%d%d%d",str,&node[i].ati,&node[i].def,&node[i].hp,&node[i].exp);
}
for(int i=1;i<(1<<20)+2;i++){
dp[i].hp=0;
}
dp[0].lev=1;
dp[0].exp=0;
for(int state=0;state<(1<<n);state++){
if(dp[state].hp<=0)continue;
for(int i=0;i<n;i++){
if(state&(1<<i))continue;
State S=dp[state];
int tmp1=max(1,S.ati-node[i].def);
int tmp2=max(1,node[i].ati-S.def);
int t=(node[i].hp/tmp1)+((node[i].hp%tmp1==0)?-1:0);
S.hp-=t*tmp2;
if(S.hp<=0)continue;
S.exp+=node[i].exp;
if(S.exp>=S.lev*100){
S.lev++;
S.ati+=In_ati;
S.def+=In_def;
S.hp+=In_hp;
}
if(S.hp>dp[state|(1<<i)].hp){
dp[state|(1<<i)]=S;
}
}
}
if(dp[(1<<n)-1].hp<=0){
puts("Poor LvBu,his period was gone.");
}else
printf("%d\n",dp[(1<<n)-1].hp);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: