1. 程式人生 > >動態規劃----數塔問題

動態規劃----數塔問題

pan 問題分析 gpo IT std 邊界值 分享 技術 ++

一、問題描述

從數塔頂層出發,每個結點可以選擇向左走或向右走,要求一直走到塔底,使得走過的路徑上的數值和最大。

技術分享圖片

如上圖所示的數塔,最大路徑和為86,經過的路徑從塔頂到塔底為13,8,26,15,24。

二、問題分析

要求的最大值可以從地形開始也可以從上面開始

動態規劃函數為:

resultTower[i][j] = tower[i][j] + Math.max(tower[i + 1][j],tower[i + 1][j + 1]);

邊界值resultTower[heigh - 1][j] = tower[heigh - 1][j];

/*
Author::若塵
*/
#include<iostream>
#include
<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int dp[1002][1002]; int main() { int t; scanf("%d", &t); int count = 1; while (t--) { memset(dp, 0, sizeof(dp)); int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) { scanf("%d", &dp[i][j]); } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { dp[i][j] += max(dp[i-1][j], dp[i][j-1]); } } printf("Scenario #%d:\n", count++); printf("%d\n\n", dp[n][m]); } }

動態規劃----數塔問題