51Nod1084 矩陣取數問題 V2

2022-05-09 13:45:14 字數 894 閱讀 6941

題目看這裡

乙個經典的dp題,典型的錯誤思想就是做兩遍

我們考慮直接做,f[i][j][x][y]表示第一次取道i,j這個位置,第二次到了x,y這個位置

考慮這個i,j和x,y分別是從**轉移過來,就可以得到方程

f[i][j][x][y]=max(f[i-1][j][x-1][y],f[i][j-1][x-1][y],f[i-1][j][x][y-1],f[i][j-1][x][y-1])+v[x][y]+v[i][j]

這個方程顯然有x+y=i+j那麼考慮去掉j,y這一維

令f[k][i][j]表示走了k步,分別走到第i行,第j行的答案,轉移可以寫成

f[k][i][j]=max(f[k-1][i][j],f[k-1][i-1][j-1],f[k-1][i-1][j],f[k-1][i][j-1])+s[i][k-i]+s[j][k-j]

注意如果i=j那麼最後那個s[j][k-j]不要加,滾動一下就可以過了

當然這題也有網路流做法,非常的類似:

在左上面建乙個源點,與(1,1)點連上,容量為2,費用為0。在右下建乙個匯點,與(n,m)連上,容量為2,費用為0.

然後在中間的每個點(i,j),拆成兩個點,建立兩條邊,一條是容量為1,費用為a[i][j]。另一條容量也是1,費用為0。再把左邊和上邊的點都連上。跑一次費用流就可以了

#pragma gcc opitmize("o3")

#pragma g++ opitmize("o3")

#include#include#include

using namespace std;

int n,m,f[

210][

210],s[

210][

210];

intmain

()

矩陣取數問題,51nod1084,多路dp

51nod1084,兩路dp,兩次從 1,1 走到 n,m 拾取路上的珍珠。dp k i j 表示第k步時,乙個人在i列,乙個人在j列,i j k m n k 2 我一般都會將輸入和處理分開來,下面的solve 函式用於處理資料 include include include include inc...

51nod1084 矩陣取數問題 V2

o n4 o n3 媽呀為什麼跑這麼慢woc include include include includeusing namespace std define rep i,s,t for int i s i t i define dwn i,s,t for int i s i t i define...

51nod 1084 矩陣取數問題 V2

1084 矩陣取數問題 v2 基準時間限制 2 秒 空間限制 131072 kb 乙個m n矩陣中有不同的正整數,經過這個格仔,就能獲得相應價值的獎勵,先從左上走到右下,再從右下走到左上。第1遍時只能向下和向右走,第2遍時只能向上和向左走。兩次如果經過同乙個格仔,則該格仔的獎勵只計算一次,求能夠獲得...