状态压缩DP~~
题目大意:吕布大战群雄,每位英雄都有自己的攻击力,防御力,还有hp(血量),吕布比较特殊,当他积累够100的经验值时他可以升级 。。升级的话加属性。
这个比较公平一点,是单挑,每一位英雄轮流与吕布作战,当吕布杀死一个英雄后,可以得到一定的经验值,问吕布能不能杀死所有的英雄,如果可以的话,求出
最后能剩余的最大血量(可以参考,打dota时比较有用的。。^_^)
思路:比较裸的状态压缩DP,直接二进制转换。一般的状态转移方程就可以了。
虽然把这道题A了,但是我感觉这样做缺乏正确性,参见http://acm.hdu.edu.cn/discuss/problem/post/reply.php?postid=3218&messageid=1&deep=0
下面不多说了,贴下代码:
View Code
1 # include<stdio.h>
2 # include<string.h>
3 # define INF 0xfffffff
4 int n,m;
5 struct node{
6 int ati,def,hp,exp;
7 }str[21];
8 int s[21]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576};
9 struct node1{
10 int ati,def,hp,exp;
11 }DP[1049000];
12 int max(int a,int b)
13 {
14 return a>b?a:b;
15 }
16 int judge(int a1,int b1,int c1,int a2,int b2,int c2)
17 {
18 int ans1,ans2,num1,num2;
19 ans1=max(1,a1-b2);
20 ans2=max(1,a2-b1);
21 num1=c1/ans2;
22 if(num1*ans2!=c1) num1++;
23 num2=c2/ans1;
24 if(num2*ans1!=c2) num2++;
25 if(num2>num1) return 0;
26 c1-=(num2-1)*ans2;
27 return c1;
28 }
29 int main()
30 {
31 int i,j,in_ati,in_def,in_hp,ati,def,hp,num,temp,ans;
32 char ch[105];
33 while(scanf("%d%d%d %d%d%d",&ati,&def,&hp,&in_ati,&in_def,&in_hp)!=EOF)
34 {
35 scanf("%d",&n);
36 for(i=0;i<n;i++)
37 scanf("%s %d%d%d%d",&ch,&str[i].ati,&str[i].def,&str[i].hp,&str[i].exp);
38 DP[0].hp=hp;
39 DP[0].exp=0;
40 DP[0].ati=ati;
41 DP[0].def=def;
42 for(i=1;i<s[n];i++)
43 {
44 DP[i].hp=-1;
45 for(j=0;j<n;j++)
46 {
47 if(i&s[j])
48 {
49 ans=i-s[j];
50 if(DP[ans].hp==-1) continue;
51 temp=judge(DP[ans].ati,DP[ans].def,DP[ans].hp,str[j].ati,str[j].def,str[j].hp);
52 if(temp==0) continue;
53 num=DP[ans].exp+str[j].exp;
54 num/=100;
55 if(DP[i].hp<temp +num*in_hp)
56 {
57 DP[i].hp=temp+num*in_hp;
58 DP[i].ati=DP[ans].ati+num*in_ati;
59 DP[i].def=DP[ans].def+num*in_def;
60 DP[i].exp=(DP[ans].exp+str[j].exp)%100;
61 }
62 /*else if(DP[i].hp==temp+num*in_hp)
63 {
64 if(DP[i].ati<DP[ans].ati+num*in_ati)
65 {
66 DP[i].ati=DP[ans].ati+num*in_ati;
67 DP[i].def=DP[ans].def+num*in_def;
68 DP[i].exp=(DP[ans].exp+str[j].exp)%100;
69 }
70 }*/
71 }
72 }
73 }
74 if(DP[s[n]-1].hp==-1) printf("Poor LvBu,his period was gone.\n");
75 else printf("%d\n",DP[s[n]-1].hp);
76 }
77 return 0;
78 }