傳紙條 NOIP2008 洛谷1006 二維dp

2022-04-07 05:24:48 字數 1056 閱讀 1895

#二維dp

###扯淡

一道比較基本的入門難度的二維dp,類似於那道方格取數,不過走過一次的點下次不能再走(看提交記錄裡面好像走過一次的加一次a[i][j]的也ac了,,),我記得當年那道方格取數死活聽不懂,最後自己硬是摸索出來了乙個搜尋加剪枝加貪心卡過去了。。現在看這道題感覺好簡單。。。。

> 一直感覺自己的水平沒什麼太大的長進,突然回頭一看,其實已經走過了好多路。

![路在腳下](

###言歸正傳

由於在題目中紙條傳遞的方向是沒有意義的,所以直接考慮將兩個紙條都從上往下傳遞,設dp[i][j][k][l]表示第一張紙條在(i,j),第二張在(k,l)時最大的好感度,更新如下:

dp[i][j][k][l] = max(dp[i-1][j][k-1][l], dp[i][j-1][k][l-1], dp[i-1][j][k][l-1], dp[i][j-1][k-1][l]) + a[i][j] + a[k][l]

**注意:要判斷一下如果(i == k) 或 (j == l) (i-1 == k) ... 等情況發生時的處理方法,具體細節請自行思考或參見****

**由於(1,1) 和 (m,n) 需要走兩次,可以考慮將起始點和終止點修改**

#include #include #include using std :: max;

const int maxn = 51;

int dp[maxn][maxn][maxn][maxn];

int a[maxn][maxn];

int m, n;

int main ()

dp[1][2][2][1] = a[1][2] + a[2][1];

for (int i = 1; i <= m; i++)

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

for (int k = 1; k <= m; k++)

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

printf("%d\n", dp[m-1][n][m][n-1]);

return 0;

}

Noip2008傳紙條題解

仍是多執行緒dp,這次直接斜著讀入,方便寫dp方程。以6 4的圖為例,讀入順序如表 從左至右,從上至下,不用管那些0 for int i 1 i m i for int j 1 j n j read map i j 1 i 00 0000 0000 00 1,4 2,4 3,4 4,4 5,4 6,...

傳紙條 NOIP2008 洛谷1006 二維dp

一道比較基本的入門難度的二維dp,類似於那道方格取數,不過走過一次的點下次不能再走 看提交記錄裡面好像走過一次的加一次a i j 的也ac了,我記得當年那道方格取數死活聽不懂,最後自己硬是摸索出來了乙個搜尋加剪枝加貪心卡過去了。現在看這道題感覺好簡單。一直感覺自己的水平沒什麼太大的長進,突然回頭一看...

NOIP2008傳紙條 DP 費用流

在乙個矩形上求兩條不相交的價值最大的路徑 常規dp題,略過 這道題可以作為費用流入門題,可以很好理解費用流的用途 1 找出方案可行 考慮最大流建圖方法 首先因為要找不想交的兩條路徑,我們可以限制每個點只被選擇一次,對於點的限制一般是拆點的套路。將乙個點i拆分為2個點,i和i 並且連邊權為1,這樣就可...