洛谷P1004 方格取數 P1006 傳紙條

2021-09-05 08:39:37 字數 1302 閱讀 4468

p1004 方格取數

p1006 傳紙條

方格取數:

設f(i,j,k,l)為從原點分別走兩條路徑分別到(i,j),(k,l)所取得的和。

狀態轉移方程:f[i][j][k][l]=max+a[i][j]+a[k][l],若(i,j)(k,l)不是同點

若(i,j)(k,l)為同點,f[i][j][k][l]=max+a[i][j]

遞推邊界:f(1,1,1,1)=a[1][1].

邊界之外:f(_,_,_,_)中_含0則狀態值為0.

正確性:若i+j==k+l,則該狀態值是正確的,否則不正確,但正確答案不受影響,因為答案所轉移的狀態都是正確的。

//方格取數遞推

#includeusing namespace std;

int n,a[10][10],d[10][10][10][10];

int max(int a,int b,int c,int d)

int main()

}

} }coutint n,a[10][10],d[10][10][10][10];

int max(int a,int b,int c,int d)

int f(int i,int j,int k,int l)

int main()

+a[i][j]+a[k][l],若(i,j)(k,l)不是同點

若(i,j)(k,l)為同點,f[i][j][k][l]=0.

遞推邊界:f(1,1,1,1)=a[1][1].

邊界之外:f(_,_,_,_)中_含0則狀態值為0.

正確性:若i+j==k+l,則該狀態值是正確的,否則不正確,但正確答案不受影響,因為答案所轉移的狀態都是正確的。

//傳紙條遞推 四維

#includeusing namespace std;

int n,m,a[55][55],d[55][55][55][55];

int max(int a,int b,int c,int d)

void debug()}}

}}int main()

*/for(int l=1;l<=m;l++)

}

} }//debug();

coutint m,n,a[55][55],d[105][55][55];

int max(int a,int b,int c,int d)

int main()

} }cout《程式有很多地方需要注意。開始時自己對四維dp的正確性非常懷疑,只好手+腦分析小資料,說是小,3*3的矩陣有3^4=81中狀態,費了兩天,終於大概想通了一些。

洛谷P1004方格取數( )

題目描述 設有n times nn n的方格圖 n le 9 n 9 我們將其中的某些方格中填入正整數,而其他的方格中則放入數字00。如下圖所示 見樣例 a 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 0 0 0 0 21 ...

洛谷 P1004 方格取數

洛谷 p1004 方格取數 設有n n的方格圖 n 9 我們將其中的某些方格中填入正整數,而其他的方格中則放 人數字0。如下圖所示 見樣例 a 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 0 0 0 0 21 0 0 0 4...

洛谷P1004 方格取數

一道顯而易見的dp題,因為要走兩次,相當於兩個人一起從起點出發,所以可採取四維陣列儲存,前兩維記錄第乙個人,後兩維記錄第二個人。轉移方程 dp i j k m max dp i 1 j k 1 m max dp i 1 j k m 1 max dp i j 1 k 1 m dp i j 1 k m ...