數字三角形 計算最大路徑 動態規劃
阿新 • • 發佈:2018-11-04
以所經過的權值之和最大值為例進行說明。
行進的過程中,每次只有兩種選擇:向左或向右。一個有n層的數字三角形的完整路徑有2n條,所以當n比較大的時候,搜尋全部路徑,從中找出最大值,效率較低。
採用動態規劃方法實現。
用d(i,j)表示從位置(i,j)出發時得到的最大值(包括位置(i,j)本身),可以寫出最大值的遞迴方程:
由於遞迴方程中包含了重複子問題,直接採用遞迴方程求解, 效率較低。採用動態規劃的方法,用一張二維表記錄中間過程的值,可以把時間效率提高到n2。
#include<stdio.h> #define N 100 #include<string.h> int MAXSUM(int a[][N],int n,int x[]) { int i,j,t; for(i=n-1;i>=1;i--){ //從最底層開始尋找 for(j=1;j<=i;j++){ //每行遍歷 if(a[i+1][j]>a[i+1][j+1]){ //左邊分支大 a[i][j]+=a[i+1][j]; t=a[i+1][j]; //用於記錄路徑 } else{ //右邊分支大 a[i][j]+=a[i+1][j+1]; t=a[i+1][j+1]; //用於記錄路徑 } } x[i]=t; } return a[1][1]; //一直累加到頂端 } void main() { int i,j,n,first; int a[N][N],x[N]; printf("需要輸入多少層的三角形?\n"); scanf("%d",&n); printf("開始輸入數字三角形資料:\n"); for(i=1;i<=n;i++){ for(j=1;j<=i;j++){ scanf("%d",&a[i][j]); } } first=a[1][1]; printf("第一層到最後一條路經過的權值最大值為: %d\n",MAXSUM(a,n,x)); printf("所經過的路徑是:\n"); printf("%d->",first); for(i=1;i<=n-2;i++){ printf("%d->",x[i]-x[i+1]); } printf("%d\n",x[n-1]); getchar(); }
三角形矩陣最大路徑 行走方式只有左右兩種方式 如果把問題看出二叉樹 那麼問題就看得明白了
把我輸入的值 做為例子所講
不管幾層原理都一樣 選擇了較大的 只能一路走下去