描述
給定乙個 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 #include89#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...