動態規劃求解矩陣累計和最大的路徑
/**
* 有一個 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;
}
執行結果:
相關文章
- 動態規劃-最大子矩陣和(ZOJ 1074 TO THE MAX )動態規劃矩陣
- 動態規劃&矩陣連乘動態規劃矩陣
- 動態規劃6:臺階問題和矩陣最小路徑問題動態規劃矩陣
- 最大子陣——動態規劃DP動態規劃
- 動態規劃最大欄位和動態規劃
- 矩陣連乘(動態規劃演算法)矩陣動態規劃演算法
- 矩陣連乘問題 Python 動態規劃矩陣Python動態規劃
- 動態規劃之最短路徑和動態規劃
- 動態規劃求解最大子段和 (兩種寫法+還原最優解)動態規劃
- 矩陣中的路徑矩陣
- 動態規劃_備忘錄法_矩陣鏈乘問題動態規劃矩陣
- 動態規劃之最長公共子序列求解動態規劃
- 禮物的最大價值(一維動態規劃&二維動態規劃)動態規劃
- 最大子矩陣和矩陣
- 動態規劃如何輸出路徑?動態規劃
- 路徑規劃: 淺談路徑規劃演算法演算法
- 強化學習(三)用動態規劃(DP)求解強化學習動態規劃
- 動態規劃求解最長上升子序列問題動態規劃
- 矩陣中最大的二維矩陣矩陣
- Java 演算法-最大矩形(動態規劃)Java演算法動態規劃
- 【動態規劃】求最大連續bit數動態規劃
- 動態規劃---例題3.最大子段和問題動態規劃
- 動態規劃--三角形最小路徑和動態規劃
- 狀態壓縮動態規劃 -- 炮兵陣地動態規劃
- 最大子段和 | 最大子矩陣 | 最大M子段和矩陣
- 網頁 UI 設計模型 — 導航和路徑規劃網頁UI模型
- [動態規劃] 五、三角形的最小路徑和動態規劃
- JZ-065-矩陣中的路徑矩陣
- 《劍指offer》:[66]矩陣中的路徑矩陣
- 【動態規劃(一)】動態規劃基礎動態規劃
- 【動態規劃】用一維和二維解決不同路徑動態規劃
- java 動態規劃(三角形最短路徑和)Java動態規劃
- 高德地圖導航和路徑規劃地圖
- 第四章:多維陣列和矩陣 ------------- 4.8 子矩陣的最大累加和陣列矩陣
- Excel中的規劃求解。Excel
- 路徑規劃演算法 - 求解最短路徑 - Dijkstra(迪傑斯特拉)演算法演算法
- 磁帶最大利用率問題——動態規劃動態規劃
- 順序表應用8:最大子段和之動態規劃法動態規劃