hdu 2809 God of War //状态压缩DP

来源:互联网 发布:mac安装iphone应用 编辑:程序博客网 时间:2024/06/05 04:52

用记忆话搜索的可能时间上稍微慢点。
/*几个陷阱吧一个是可能出现攻击比防御小的情况,那么取伤害为1另一种就是经验不清零,题目没提及吧*/#include <stdio.h>#include <string.h>struct LVBU{    int ATI,DEF,HP,EXP,level;}peo[21], lv;int In_ATI,In_DEF,In_HP;int n;int N;LVBU dp[1 << 20];bool vis[1 << 20];void solve(int sta){    if(vis[sta])  return;    vis[sta] = 1;    int state = sta;    int i = 0;    bool flag = false;    while(state)    {        if(state & 1)        {            solve(sta ^ (1 << i));            LVBU t= dp[sta ^ (1 << i)];            if(t.level <= 0)            {                state >>= 1;                i++;                continue;//已经挂了            }            int dec = t.ATI - peo[i].DEF;            if(dec <= 0)  dec = 1;//特殊情况            int times = peo[i].HP / dec;            if(times * dec != peo[i].HP)  times++;            dec = peo[i].ATI - t.DEF;            if(dec <= 0)  dec = 1;            t.HP -= dec * (times - 1);            if(t.HP <= 0)            {                state >>= 1;                i++;                continue;            }            t.EXP += peo[i].EXP;            if(t.EXP >= t.level * 100)            {                int add = t.EXP / 100 - t.level + 1;                t.level += add;                t.ATI += add * In_ATI;                t.DEF += add * In_DEF;                t.HP += add * In_HP;            }            if(!flag || (t.HP > dp[sta].HP) || (t.HP == dp[sta].HP && t.level > dp[sta].level))            {                dp[sta] = t;                flag = true;            }        }        state >>= 1;        i++;    }    if(!flag)  dp[sta].level = -1;//没希望了。。。。    return;}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) != EOF)    {        dp[0].EXP = 0;//一个人没杀的初始状态        dp[0].level = 1;        char name[200];        scanf("%d", &n);        for(int i = 0; i < n; i++)        scanf("%s%d%d%d%d", name, &peo[i].ATI, &peo[i].DEF, &peo[i].HP, &peo[i].EXP);        N = 1 << n;        memset(vis, 0, sizeof(vis));        vis[0] = 1;        solve(N - 1);        lv = dp[N-1];        if(lv.level <= 0)  printf("Poor LvBu,his period was gone.\n");        else printf("%d\n", lv.HP);    }    return 0;}


原创粉丝点击