hdu 2809 God of War //狀態壓縮DP

用記憶話搜索的可能時間上稍微慢點。

/*
幾個陷阱吧
一個是可能出現攻擊比防禦小的情況,那麼取傷害爲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;
}


發佈了526 篇原創文章 · 獲贊 3 · 訪問量 75萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章