這也是當初卡了很久的一道題
題意:從左上角的格仔出發選一條路徑到右上角然後再回到左上角,而且兩條路徑除了起點和終點不能有重合的點。問所經過的格仔中的最大和是多少
狀態設計:我們可以認為是從左上角出發了兩條路徑,然後同時到達右下角。容易看出,第k個階段所有可能到達的格仔構成一條斜線而且滿足x1 + y1 = x2 + y2 = k + 1
dp[k][x1][x2]表示第k階段兩條路分別到達(x1, y1) (x2, y2)所能取得的最大值(y1 y2根據上面的等量關係來計算),如果x1 = x2表示兩條路徑匯合於一點了
狀態轉移方程:
在求解第k階段最優解時,首先列舉k-1階段時的狀態(x1', x2'),然後向四個方向延伸出(x1, x2)
dp[k][x1][x2] = max
在迴圈的過程中可能會出現從乙個點延伸的下乙個點的情況,即兩條路徑可能重合,不過不要緊,因為格仔裡面都是正數,所以得到的最優解一定是兩條不重合的路徑
優化:因為兩條路徑具有任意性,所以不妨規定第一條路在第二條路的下方(或同一水平線),時間從92ms優化到62ms
第k階段狀態的轉移只依賴第k-1階段的狀態,可以用滾動陣列(由於原來的空間本不大,所以**中沒有實現滾動陣列)
1**君//#define local
2 #include 3 #include 4 #include 5
using
namespace
std;67
int dp[70][35][35], num[35][35
], n;89
bool islegal(int x, int
y)10
1314
int main(void)15
46}47}
48}49 printf("
%d\n
", dp[2*n-1
][n][n]);50}
51return0;
52 }
POJ 2686 狀態壓縮DP
題目鏈結 題目大意 有乙個旅行家計畫旅行,他所在城市有m個城市,在城市之間有p條路徑。從某個城市沿著某條道路到相鄰的城市需要坐馬車,而乘坐馬車需要車票。一張車票只能通過一條路,每張車票都記有馬的數量。從乙個城市到另乙個城市所需要的時間是城市之間道路的長度除以馬的數量的結果。這位旅行家一共有n張車票,...
POJ 2686 狀態壓縮DP
大致題意 有m座城市,城市間有p條道路,商人持有n張車票,張車票對應相應的馬匹數為 ti 需要從城市a前往城市b。兩個直接相連城市花費時間為道路長度除以車票對應馬匹數。求所需最小時間,不可達輸出 impossible 1 n 8,2 m 30。考慮 現在所餘車票集合s,目前位於城市v 的狀態,n範圍...
poj2686 狀態壓縮dp
這個題的意思是給你乙個m個頂點,p條邊的無向圖,現在想從a走到b,旅者也帶有n張車票,每張車票上有一定數量的馬匹數量,經過一條邊必須使用車票,且時間花費是邊的長度除以馬匹數量,問你最少多長時間到達b 我們可以定義狀態dp s u 表示從在u點持有s的車票,那麼下面就可以採用刷表法更新最短路,如下 i...