多程序DP 總結

2021-08-02 08:11:16 字數 1305 閱讀 8983

eg 1 方格取數 (noip 2000)

如果用兩次一般的動歸,可能不能得到最優解。這如同乙個大蘋果加乙個小蘋果還不如兩個中蘋果加在一起。這時就要考慮更改狀態。因為單獨看第乙個人的位置或第二個人的位置並不能組成乙個完整的狀態,但兩個人的位置合起來就是乙個完整的狀態了,所以新的狀態包含了兩個人的位置。

新的狀態為f[x1][y1][x2][y2],表示兩個人分別走到(x1,y1)(x2,y2)時取得的最大值。將它作為狀態,決策將會有4種:

1.(第乙個人從上面走來,第二個人從上面走來)

2.(第乙個人從上面走來,第二個人從左面走來)

3.(第乙個人從左面走來,第二個人從上面走來)

4.(第乙個人從左面走來,第二個人從左面走來)

除了考慮決策,還要考慮同行、同列和同點的情況。

關鍵dp**

for(int x1=1; x1<=n; x1++)

else}}

}}//return dp[n][n][n][n]+rect[1][1]; //記住加上第乙個數

狀態的優化

可以再一次改變狀態的表示法,減少狀態的維數。

如果我們定義f[steps][x1][x2]為每個人的橫座標和縱座標之和為steps,第乙個人的橫座標為x1,第二個人的橫座標為x2,這也是可以唯一而正確地表示狀態的。

const

int maxn=15;

int n;

int rect[maxn][maxn];

int f[maxn*2][maxn][maxn];

int dp()}}

return f[steps][n][n]+rect[1][1]; //一定要記住加上rect[1][1]

}

int dp()}}

}return f[r][c][r][c];

}

狀態優化

同理,我們也可以將狀態定義為f[steps][x1][x2],含義跟eg 1中的一樣。

const

int maxn=55;

int r,c;

int rect[maxn][maxn];

int f[2*maxn][maxn][maxn];

int dp()}}

return f[steps][r][r]; //和為steps,行座標分別為r,r

}

多程序DP 礦工

礦工 問題描述 有兩個煤礦,每個煤礦都雇用了一些礦工。挖煤這活很累,所以礦工們需要很多的食物。正好,每當新的食物到他們的礦上的時候,礦工們將會考慮這乙份和先前的兩份食物 如果沒有那麼多就少考慮些 如下判斷 如果所有的食物都是一樣的,他們產1單位的煤。如果有兩種食物,生產2單位的煤 如果有三種不同的食...

Multiprocessing多程序 (總結)

queue的功能是將每個核或執行緒的運算結果放在隊裡中,等到每個執行緒或核執行完畢後再從佇列中取出結果,繼續載入運算。原因很簡單,多執行緒呼叫的函式不能有返回值,所以使用queue儲存多個執行緒運算的結果 import multiprocessing as mp def job q res 0 fo...

多程序 多程序queue

多程序 import multiprocessing import threading import time defthread run print threading.get ident defrun name time.sleep 2 print hello name t threading....