經典的dp入門題。
最近學起dp,做回這道題目,用的是自頂向上的方法來求解,發現**很長,不過時間短了,這應該就是傳說中的「以空間換時間」的說法吧。個人覺得,這比較符合人的思考模式,不過真的很繁瑣,由於不知道最後一行中最大和的具體位置,還要比較找出。
狀態轉移方程是(設f(i, j)為三角形上從點(i,j)出發向下走的最大和路徑, a(i, j)表示原始輸入的第 i 行第 j 列的數 :
f(i, j) = a(i, j) + max i != j (每行裡除第一和最後的處於中間位置的數
a(i, j)+ f(i-1, j) j = 0 (每行裡的第乙個數)
a(i, j) + f(i-1, j-1) j = i (每行裡的最後乙個數)
1 #include 2using
namespace
std;34
intmain()517
for (i = 1; i < n; i++)
1825
else
if (i == j) //
每行的最後乙個數只能從它的左上一行+當前行的數
26 a[i][j] = a[i-1][j-1] +a[i][j];
27else
2834}35
}36 maxsum = -100;37
for (j = 0; j <= n-1; j++)
38if (maxsum < a[n-1
][j])
39 maxsum = a[n-1
][j];
40 printf("
%d\n
", maxsum); 41}
42}43return0;
44 }
自底向上的求法:
(連特殊位置的判斷都不用考慮了,而且保證最後輸出的a[0][0]一定是最大的)
1 #include 2using
namespace
std;34
intmain()517
for (i = n - 2; i >= 0; i--)
1826
}27 printf("
%d\n
", a[0][0
]); 28}
29}30return0;
31 }
Hdu 2084 數塔 簡單
hdu 2084 題目描述 在講述dp演算法的時候,乙個經典的例子就是數塔問題,它是這樣描述的 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?已經告訴你了,這是個dp的題目,你能ac嗎?input 輸入資料首先包括乙個整數c,表示測試例項的個數,...
HDU 2084 數塔(簡單DP)
hdu 2084 數塔 題意 自上而下,選擇一條累計和最大的路徑 分析 頂點只與左右兩個子節點相關,且子節點路徑的選擇與頂點無關 無後效性 狀態dp i j 表示 i,j 點向下得到的最大累計和 轉移方程 dp i j max dp i 1 j dp i 1 j 1 v i j 核心 for i n...
hdu 2084 數塔(動態規劃)
problem description 在講述dp演算法的時候,乙個經典的例子就是數塔問題,它是這樣描述的 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?已經告訴你了,這是個dp的題目,你能ac嗎?輸入資料首先包括乙個整數c,表示測試例項的個數,...