ZOJ3352 記憶化搜尋

2021-07-27 03:33:20 字數 1445 閱讀 7562

先膜拜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.每個小朋友都...