經典數塔問題(動態規劃)

有形以下圖所示的數塔,從頂部出發,在每一結點能夠選擇向左走或是向右走,一直走到底層,要求找出一條路徑,使路徑上的值最大。ios

 

 

從頂點出發時究竟是向左走仍是向右走應取決於向左走能取得最大值仍是向右走能取得最大值,只有兩條路徑上的最大值求出來了才能作出決策,數組

即dp[1][1] = max(dp[2][1],dp[2][2])spa

故由此推得狀態轉移方程爲dp[i] = max(dp[i+1][j],dp[i+1][j+1]);3d

邊界條件即最下邊一層的數據code

//數塔問題
#include<iostream>
using namespace std; int main() { int n; int f[100][100] = {0}; int dp[100][100] = {0};//狀態數組
    while(cin>>n) { memset(f,0,sizeof(f)); memset(dp,0,sizeof(dp)); //輸入數塔
        for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) cin>>f[i][j]; //邊界,最底下一層的數塔dp值等於f值
        for(int j=1;j<=n;j++) dp[n][j] = f[n][j]; for(int i=n-1;i>=1;i--) { for(int j=1;j<=i;j++) { //狀態轉移方程
                dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]) + f[i][j]; } } cout<<dp[1][1]<<endl;//dp[1][1]即爲所求
 } return 0; }
相關文章
相關標籤/搜索