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


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

 

 

從頂點出發時到底是向左走還是向右走應取決於向左走能取得最大值還是向右走能取得最大值,只有兩條路徑上的最大值求出來了才能做出決策,

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

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

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

//數塔問題
#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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM