設有 n×n 的方格圖,我們在其中的某些方格中填入正整數,而其它的方格中則放入數字0。如下圖所示:
某人從圖中的左上角 a 出發,可以向下行走,也可以向右行走,直到到達右下角的 b 點。
在走過的路上,他可以取走方格中的數(取走後的方格中將變為數字0)。
此人從 a 點到 b 點共走了兩次,試找出兩條這樣的路徑,使得取得的數字和為最大。
輸入格式
第一行為乙個整數n,表示 n×n 的方格圖。
接下來的每行有三個整數,第乙個為行號數,第二個為列號數,第三個為在該行、該列上所放的數。
行和列編號從 1 開始。
一行「0 0 0」表示結束。
輸出格式
輸出乙個整數,表示兩條路徑上取得的最大的和。
資料範圍
n≤10
輸入樣例:
82 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0
輸出樣例:
67解析:可以把問題考慮成兩個人都從起點出發走到終點的最大值
f[i1][j1][i2][j2]表示走到(i1, j1),(i2.j2)的最大值,可以優化成三維的
f[k][i][j] 表示同時走了k步到(i1, k - i1),(i2, k - i2)的最大值;
在轉移之前需要判斷i1是否等於i2如果相等的話就只能加一次該點的權重
**:
#include
#include
#include
using namespace std;
const int n = 15;
int f[n * 2]
[n][n]
;int a[n]
[n];
int main()}
}
cout << f[n * 2]
[n][n]
<< endl;
return 0;
}
數字三角形模型
y式dp 集合角度 集合劃分 i,j 一定是從 i 1,j i,j 1 兩步中轉移而來 轉移方程 時間複雜度 o n 2 for int i 1 i n i for int j 1 j n j f i j max f i 1 j f i j 1 w i j 優化 從轉移方程來看,我們每次只用到了本層...
數字三角形
題目描述 示出了乙個數字三角形。請編乙個程式計算從頂至底的某處的一條路 徑,使該路徑所經過的數字的總和最大。每一步可沿左斜線向下或右斜線向下走 1 三角形行數 25 三角形中的數字為整數 1000 輸入第一行為n,表示有n行 後面n行表示三角形每條路的路徑權 輸出路徑所經過的數字的總和最大的答案 樣...
數字三角形
description 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?input 輸入資料首先包括乙個整數c,表示測試例項的個數,每個測試例項的第一行是乙個整數n 1 n 100 表示數塔的高度,接下來用n行數字表示數塔,其中第i行有個i個整數,...