動態規劃求解矩陣累計和最大的路徑
阿新 • • 發佈:2019-02-18
/** * 有一個 M x N 的矩陣,其中每個格子裡面都有特定的錢。 * 左上角走到右下角,只能向右或者向下走,問怎麼走才能撿到最多的錢。 * 輸出撿錢的路徑。 * 解析: 動態規劃。 首先找到子結構,構造遞推式。 * 對於每個位置能撿到的最多的錢是: * a[i][j] = max{a[i-1][j] + w[i][j],a[i][j-1] + w[i][j]} */ #include <stdio.h> #define M 5 #define N 4 int w[M][N]; //矩陣 int a[M][N]; //當前撿到的最大的錢的值 int path[M][N]; //記錄路徑,1表示從上面撿著錢下來,0表示從左邊撿著錢過來 void find_path(){ int i,j; a[0][0] = w[0][0]; //初始化左邊界 for(i=0;i<M;i++){ a[i][0] = a[i-1][0] + w[i][0]; path[i][0] = 1; } //初始化右邊界 for(j=0;j<N;j++){ a[0][j] = a[0][j-1] + w[0][j]; path[0][j] = 0; } //兩個迴圈開始自底向上求解 for(i=1;i<M;i++){ for(j=1;j<N;j++){ int up = a[i-1][j] + w[i][j]; int left = a[i][j-1] + w[i][j]; if(up > left){ a[i][j] = up; path[i][j] = 1; } else{ a[i][j] = left; path[i][j] = 0; } } } } int main(){ int tmp[M][N] = {{4,3,12,1},{11,7,4,2},{6,20,15,2},{4,5,8,1},{3,3,4,6}}; int i,j; //初始化矩陣 for(i=0;i<M;i++) for(j=0;j<N;j++){ w[i][j] = tmp[i][j]; } printf("\n\n"); //自底向上求解 find_path(); //打印出路徑以及每個位置能撿到的最多的錢數 for(i=0;i<M;i++){ for(j=0;j<N;j++) printf("%5d(%d)",a[i][j],path[i][j]); printf("\n"); } return 0; }
執行結果: