CH5103 傳紙條 線性dp

2022-06-26 03:57:11 字數 1440 閱讀 8479

描述

給定乙個 n*m 的矩陣a,每個格仔中有乙個整數。現在需要找到兩條從左上角 (1,1) 到右下角 (n,m) 的路徑,路徑上的每一步只能向右或向下走。路徑經過的格仔中的數會被取走。兩條路徑不能經過同乙個格仔。求取得的數之和最大是多少。n,m≤50。

輸入格式

第一行有2個用空格隔開的整數n和m,表示有n行m列(1<=n,m<=50)。

接下來的n行是乙個n*m的矩陣,每行的n個整數之間用空格隔開。

輸出格式

乙個整數,表示答案。

樣例輸入

3 3

0 3 9

2 8 5

5 7 0

樣例輸出
34
資料範圍與約定

**ccf noip2008 t3

題意:n*m的格仔裡每個格仔有乙個權值,從(1,1)走到(n,m)兩條路,(只能向下或者向右)求路徑之和。走過的格仔只算一次權值。

思路:把「路徑長度」即當前走過的步數作為dp的「階段」。【因為只能向下或向右,走到(n,m)時的路徑長度是n+m-2】

每乙個階段中,把兩條路徑同時擴充套件一步,路徑長度增加1,從而轉移到下乙個階段。

還需確定兩條路徑當前的末尾位置。並且 x1+y1 = x2 + y2 = i + 2

所以就可以用三維dp維護,每次有4種擴充套件方式。並且要考慮擴充套件後是否兩個點座標相同。

目標是dp[n+m-2][n][n]

1 #include 2 #include3 #include4 #include5 #include6 #include7 #include8

9#define inf 0x3f3f3f3f

10using

namespace

std;

11 typedef long

long

ll;12

13int

n, m;

14const

int maxn = 55;15

intg[maxn][maxn];

16int dp[maxn * 2][maxn][maxn] = ;

1718

intmain()

1925}26

27 dp[0][1][1] = g[1][1

];28

for(int i = 0; i <= n + m - 2; i++)

36else

4041

if(x1 == x2 + 1 && y1 + 1 ==y2)

44else

4748

if(x1 + 1 == x2 && y1 == y2 + 1)51

else54}

55}56}

57 printf("

%d\n

", dp[n + m - 2

][n][n]);

58return0;

59 }

線性DP 傳紙條

這道題資料很小所以我們o n 4 o n 4 o n4 也可以過也就是4個狀態去的時候的x1,x2 x 1,x 2 x1 x2 和回來的時候的x3,x4 x 3,x 4 x3 x4 座標的最大值。正解 言歸正傳 我們如何確定兩個點是否相交呢?是不是我們橫縱座標相等並且我們的x座標或者y座標也相等的時...

雙線dp(傳紙條)

題意 給乙個矩陣從 1,1 n,m 然後再從 n,m 1,1 並且兩條路線不能有任何乙個位置重疊,求最大和 輸入 第一行輸入乙個正整數t,代表t組輸入 接下來輸入兩個正整數 0題解 一道典型的雙線dp,可以開乙個四維陣列dp 記錄兩個人的狀態每個人都有兩種狀態組合起來有四種,把四種狀態寫出來 dp ...

傳紙條(普通dp)

小淵和小軒是好朋友也是同班同學,他們在一起總有談不完的話題。一次素質拓展活動中,班上同學安排做成乙個 mmm 行 nnn 列的矩陣,而小淵和小軒被安排在矩陣對角線的兩端,因此,他們就無法直接交談了。幸運的是,他們可以通過傳紙條來進行交流。紙條要經由許多同學傳到對方手裡,小淵坐在矩陣的左上角,座標 1...