nyoj61 傳紙條(一) (雙線dp)

2021-07-09 14:52:29 字數 969 閱讀 9887

初次學雙程序dp,其實就是多維dp,但是就是多一維我的腦子就轉不過來了,模模糊糊看得懂而已,

從矩陣的左上角(1,1)點到矩陣的右下角(m,n)點找到兩條不相交的路徑使其值最大,

題中是從(1,1)到(m,n)走一次,再從(m,n)到(1,1)走一次,我們可以等價變形

一下,變為:同時從(1,1)走向(m,n)找兩條路,且這兩條路不相交,同時走!

假設有兩個人在走,乙個人的座標為(x1,y1),另乙個人的座標為(x2,y2),有題中規定

只能向下或向右走,則可得狀態轉移方程:

f(x1,y1,x2,y3)  =  max + map[x1][y1] + map[x2][y2]

這樣寫的話  時間複雜度會是o(n^4),比較大容易超時,改進:

因為 兩個人是同時走的所以 每次都是同時移動一格:因此有   x1+y1==x2+y2 == k

則狀態方程可以改為:

f(k,x1,x2) = max  + map[x1][k-x1] + map[x2][k-x2]

其實這個狀態方程還是很好理解的,但是困難就在各個變數的取值和方向,

其中k[1,n+m-1],因為每一步二者都是不一樣的,終點是在[m-1][n]和[m][n-1],所以決策的總數是m+n-1

x1[1,m],x1[1,m],但是x1!=x2,因為二者不能走到同一步,還有k-x1和k-x2均不能大於n

這個三維得出來的結果其實是對稱的,所以可以x1[1,m],x2[x1+1,m],但是目前還不太明白三維的算出來的結果,感覺很亂,所以先把所有數都算一遍

#include #include #include #include using namespace std;

#define n 55

int n,m;

int dp[105][n][n],a[n][n];

int main()}}

cout<

nyoj 61 傳紙條(一)

分析 一道雙線程動態規劃題,與第六屆河南acm比賽的題類似.題意 小紙條從 1,1 傳到 m,n 再傳回來,並且路線不能交叉,使好感度之和最高.我們可以認為是同時找出兩條從 1,1 傳到 m,n 的不相交的路線.方法是 計算每一步情況下的情況,一條道路用i,j控制,另一條用x,y控制.從矩陣的角度看...

nyoj61 傳紙條(一) dp

思路 兩人乙個從左上角出發只能向右和向下,另一人從右下角出發只能向左和向上,可以看做兩人都是從右下角出發,且只能向左和向上傳紙條,並且兩條路徑不會相交,因為乙個人只會傳一次,那麼隨便畫乙個圖就能知道兩條路徑是閉合的圖形。因此我們可以定義dp x1,y1,x2,y2 是從 0,0 出發第一人到達 x1...

nyoj 61 傳紙條(一) 動態規劃

時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 小淵和小軒是好朋友也是同班同學,他們在一起總有談不完的話題。一次素質拓展活動中,班上同學安排做成乙個m行n列的矩陣,而小淵和小軒被安排在矩陣對角線的兩端,因此,他們就無法直接交談了。幸運的是,他們可以通過傳紙條來進行交流。紙條要...