1. 程式人生 > >記憶化搜尋入門——數塔

記憶化搜尋入門——數塔

數字三角形問題

Time Limit: 1000MS Memory Limit: 65536KB           Submit Statistic Discuss

Problem Description

給定一個由n行數字組成的數字三角形如下圖所示。試設計一個演算法,計算出從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大。
 
對於給定的由n行數字組成的數字三角形,計算從三角形的頂至底的路徑經過的數字和的最大值。

Input

輸入資料的第1行是數字三角形的行數n,1≤n≤100。接下來n行是數字三角形各行中的數字。所有數字在0..99之間。

Output

輸出資料只有一個整數,表示計算出的最大值。

Example Input

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

Example Output

30
分析:直接搜尋的話我們每次都會進行很多次多餘的操作,所以我們不妨把每次搜尋的結果記錄下來,這樣就避免了大量的重複計算,節約時間。每次的結果只和上次的狀態有關,這樣的時候就可以考慮記憶化搜尋,也就是動態規劃。
#include <bits/stdc++.h>

using namespace std;
int n;

int mp[105][105];
int dp[105][105];

int ans;

int dfs(int s,int e)
{
    if(dp[s][e])
    {
        return dp[s][e];
    }

    if(s>n || e>n) return 0;

    dp[s][e]=max(dfs(s+1,e),dfs(s+1,e+1))+mp[s][e];

    return dp[s][e];

}
int main()
{
    cin>>n;

    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++)
    {
        scanf("%d",&mp[i][j]);
    }

    cout<<dfs(1,1);

    return 0;
}