您的位置:首页 > 编程语言 > Go语言

【HDOJ】2809 God of War

2015-01-23 23:42 357 查看
状态DP。

/* 2809 */
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;

#define MAXN 20

typedef struct {
int a, d, h, e;
} hero_t;

hero_t hero[MAXN];
int dp[1<<MAXN];
int exp[1<<MAXN];
int mask[MAXN];
bool visit[1<<MAXN];
char name[25];
queue<int> Q;

int main() {
int n, m, size;
int la, ld, lh;
int ia, id, ih;
int ra, rb, ha, hb;
int i, j, k, tmp;
int s, ss;
int slev, alev, dlev, hlev, sslev;

#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
#endif

mask[0] = 1;
for (i=1; i<MAXN; ++i)
mask[i] = (mask[i-1]<<1);

while (scanf("%d%d%d%d%d%d", &la,&ld,&lh, &ia,&id,&ih) != EOF) {
scanf("%d", &n);
for (i=0; i<n; ++i)
scanf("%s %d %d %d %d", name, &hero[i].a,&hero[i].d,&hero[i].h,&hero[i].e);
m = 1<<n;
memset(dp, 0, sizeof(int)*m);
memset(visit, false, sizeof(bool)*m);
dp[0] = lh;
exp[0] = 0;
Q.push(0);
visit[0] = true;
while (!Q.empty()) {
s = Q.front();
Q.pop();
visit[s] = false;
for (i=0; i<n; ++i) {
if (s & mask[i])
continue;
ss = s | mask[i];
// calculate s-state level
slev = exp[s]/100;
alev = la+slev*ia;
dlev = ld+slev*id;
// calculate hurt and round
ha = max(1, alev-hero[i].d);
hb = max(1, hero[i].a-dlev);
ra = (hero[i].h+ha-1)/ha;
rb = (dp[s]+hb-1)/hb;
if (ra > rb)
continue;    // LvBu Lose
exp[ss] = exp[s] + hero[i].e;
sslev = exp[ss]/100;
// calculate new hp
tmp = dp[s] - (ra-1)*hb + (sslev-slev)*ih;
dp[ss] = max(dp[ss], tmp);
if (visit[ss] == false) {
visit[ss] = true;
Q.push(ss);
}
}
}
if (dp[m-1])
printf("%d\n", dp[m-1]);
else
printf("Poor LvBu,his period was gone.\n");
}

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