乙個很經典的題目了,以前沒有學過dp感覺寫的不明所以然,現在我覺得懂了吧...
閆式分析法我覺得我用的很奇怪,具體奇怪在哪我也說不上來,但我自己習慣於一種思考方式:
先上題目吧:
給定乙個如下圖所示的數字三角形,從頂部出發,在每一結點可以選擇移動至其左下方的結點或移動至其右下方的結點,一直走到底層,要求找出一條路徑,使路徑上的數字的和最大。
輸入格式7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
第一行包含整數 n
'>n
n,表示數字三角形的層數。
接下來 n
'>n
n 行,每行包含若干整數,其中第 i
'>i
i 行表示數字三角形第 i
'>i
i 層包含的整數。
輸出格式
輸出乙個整數,表示最大的路徑數字和。
資料範圍1≤
n≤500'>1≤n≤500
1≤n≤500,
−10000≤三
角形中的
整數≤10000
'>−10000≤三角形中的整數≤10000
−10000≤三角形中的整數≤10000
輸入樣例:
輸出樣例:5
73 8
8 1 0
2 7 4 4
4 5 2 6 5
30
這題一看就知道是dp題,不過做題目不能硬做,要分析了之後再寫
比如在考慮狀態轉移方程的時候,從上到下考慮還是從下往上考慮,從上往下考慮的時候邊界還要特判,很麻煩,所以優先考慮從下到上的順序
對於我自己來說,首先是確立狀態轉移方程,就是令dp【i】或者dp【i】【j】代表了什麼含義
比如這個題的f[i][j]代表了路徑的最優解也就是最大值,之前的過河卒的dp[i][j]代表了到i,j這個點路徑之和,還有昨天存錢的問題dp[i]代表了存到某個數的次數
揹包問題那就更是經典。我說的這些好像就是y總說的集合的概念??
然後開始寫狀態轉移方程了,這個就有很多種情況了,有類似於遞推的過程,有類似於揹包的一些問題
比如對應剛剛的問題,dp【i】【j】可以從左下和右下得到,然後每次得到時求最大值,過河卒就是感覺直接的遞推了,每個座標都由左和上得到,一共是x+y
存錢問題這個就好經典啊,dp[i]可以由dp[i-1]得到,可以由乙個數加上6的次方之後得到,可以由乙個數加上9的次方數得到。這些狀態轉移方程不就有了麼
寫的時候思路不是太清楚,諒解啊
#includeusingnamespace
std;
const
int n=510
;int
f[n][n],w[n][n];
intmain()
}for(int i=1;i<=n;i++) f[n][i]=w[n][i];//
初始化for(int i=n-1;i>0;i--)//
最後一行賦初值了,為最後一行的最大值,此時從n-1行開始
} cout
<1][1]
}
就根據這道題咱們來分析一下:
首先令dp[i][j]為到達(i,j)這個座標的最大值,類似於遞推吧,然後從下到上遞推(i,j)這個點可以由(i+1,j)和(i+1,j+1)兩個點得到。然後類似的...我覺得分析到這邊已經可以了...
加油吧!
數字三角形
題目描述 示出了乙個數字三角形。請編乙個程式計算從頂至底的某處的一條路 徑,使該路徑所經過的數字的總和最大。每一步可沿左斜線向下或右斜線向下走 1 三角形行數 25 三角形中的數字為整數 1000 輸入第一行為n,表示有n行 後面n行表示三角形每條路的路徑權 輸出路徑所經過的數字的總和最大的答案 樣...
數字三角形
description 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?input 輸入資料首先包括乙個整數c,表示測試例項的個數,每個測試例項的第一行是乙個整數n 1 n 100 表示數塔的高度,接下來用n行數字表示數塔,其中第i行有個i個整數,...
數字三角形
3 8 8 1 0 2 7 4 4 4 5 2 6 5 上圖給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,和最大的路徑稱為最佳路徑。你的任務就是求出最佳路徑上的數字之和。input 1 5 7 3 8 8 1 0 2 7 4 4 4 ...