數塔問題--求最大值軌跡
阿新 • • 發佈:2018-12-30
題目描述:
在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的:
有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大的軌跡是多少?
解題思路:簡單動態規劃,蒟蒻用了半小時。
解題程式碼:
#include<iostream> #include<algorithm> using namespace std; const int N=10; int m,n; int d[N][N]; int v[N][N]; int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ cin>>d[i][j]; } } for(int i=n-1;i>=1;i--){ for(int j=1;j<=i;j++){ v[i][j]=d[i][j]; d[i][j]=max(d[i+1][j],d[i+1][j+1])+v[i][j]; } } for(int i=1;i<=n;i++){ v[n][i]=d[n][i]; } for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ cout<<d[i][j]<<" "; } cout<<endl; } for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ cout<<v[i][j]<<" "; } cout<<endl; } int MAX=0; for(int i=1;i<n;i++){ for(int j=1;j<=i;j++){ if(i==1){ MAX=d[i][j]-v[i][j]; cout<<v[i][j]<<endl; } if(MAX==d[i+1][j]){ MAX=MAX-v[i+1][j]; cout<<v[i+1][j]<<endl; break; } else if(MAX==d[i+1][j+1]){ MAX=MAX-v[i+1][j+1]; cout<<v[i+1][j+1]<<endl; break; } } cout<<endl; } return 0; } /* 5 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 */