先膜拜watashi!
前言:比賽的時候,確定的是這是乙個博弈,然後就是各種瞎猜,後面想到dp[ x ][ y ]代表x表白色的狀態,y表黑色的狀態,無果。掛機開始。gg、巨菜。
思路:這一發記憶化搜尋真是玄學。
仔細想想,首先我只要求權值最大,我不在乎輸贏。
直接就是dp[i][j][k]代表當前白在 i 位置,黑在 j 位置,k為當前局勢的賭資,dp存整個子結構包括本身的最大值。
然後記憶化搜尋一發就可以了,很神奇。
記憶化搜尋獨有的味道:當前位置的狀態為之前(其實是之後?)最優狀態的轉化(前身?)。
這裡還有一點就是在搜的連續兩步,其實分成了兩個人的行為,所有當前的最大為之後那個人贏的相反數。(他贏即我輸)
watashi美麗code:(小引用好酷)
#include #include #include using namespace std;
const int maxn = 52;
const int inf = 65536;
int d[maxn];
vectore[maxn];
int b[maxn][maxn][maxn * 4];
int c[maxn][maxn][maxn * 4];
int gao(int x, int y, int z)
int tmp;
int &ret = b[x][y][100 + z], &cnt = c[x][y][100 + z];
ret = (e[x].empty() && e[y].empty()) ? -z : -inf;
cnt = 1;
for (vector::const_iterator i = e[x].begin(); i != e[x].end(); ++i) else if (tmp == ret)
} for (vector::const_iterator i = e[y].begin(); i != e[y].end(); ++i) else if (tmp == ret)
} return ret;
}int main()
for (int i = 0; i < m; ++i)
memset(c, 0xff, sizeof(c));
gao(x, y, 1);
printf("%d %d\n", b[x][y][101], c[x][y][101]);
} return 0;
}//run id submit time judge status problem id language run time(ms) run memory(kb) user name admin
//584 2010-07-16 19:50:54 accepted 1074 c++ 860 4572 anotherpeg source
zoj 3469 dp 記憶化搜尋
zoj 3469 記憶化dp dp i j 0 1 表示已經送過左邊的i個和右邊的j個,01分別表示當前停在那裡 key2 當前要走的距離也是其之後要送的走的距離 參照大牛寫的,orz,dp的路還很長啊 include include include include define min a,b a...
記憶化搜尋
演算法上依然是搜尋的流程,但是搜尋到的一些解用 動態規劃 的那種思想和模式作一些儲存。一般說來,動態規劃總要遍歷所有的狀態,而搜尋可以排除一些無效狀態。更重要的是搜尋還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求...
記憶化搜尋
記憶化搜尋 演算法上依然是搜尋的流程,但是搜尋到的一些解用動態規劃的那種思想和模式作一些儲存。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求解乙個狀態,就將它的解儲存下來,以後再次遇到這個狀態的時候,就不必重新求解了。例1.題目描述 給從左至右排好隊的小朋友們分糖果,要求 1.每個小朋友都...