c++ 動態規劃(dp)
題目描述
觀察下面的數塔。寫一個程式查詢從最高點到底部任意位置結束的路徑,使路徑經過數字的和最大。
每一步可以從當前點走到左下角的點,也可以到達右下角的點。
輸入
5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11
輸出
86
AC程式碼
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 505;
int dp[MAXN][MAXN],a[MAXN][MAXN];
int max(int a,int b)//max函式求兩個數字之間的最大值
{
return a>b?a:b;
}
int main()
{
int n;
cin >> n;
for (int i = 1;i <= n;i ++)//輸入
{
for (int j = 1;j <= i;j ++)
{
cin >> a[i][j];
}
}
dp[1][1] = a[1][1];//把起點直接放在dp[]裡面
for (int i = 2;i <= n;i ++)
{
for (int j = 1;j <= i;j ++)
{
dp[i][j] = max(dp[i - 1][j - 1],dp[i - 1][j]) + a[i][j];//dp公式,原理是先走一步,然後掃描這個點的上一層的鄰接點看看哪個點的dp值最大,然後用最大值加上他本身
}
}
int ans = 0;
for (int i = 1;i <= n;i ++)
{
ans = max(ans,dp[n][i]);//ans的作用是在最底部的元素中找一個最大的dp,輸出
}
cout << ans << endl;
return 0;
}