記憶化搜尋入門——數塔
阿新 • • 發佈:2018-12-23
數字三角形問題
Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic DiscussProblem 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; }