描述有如下所示的数塔要求从底层走到顶层若每一步只能走到相邻的结点则经过的结点的数字之和最大是多少?输入描述输入数据首先包括一个整数整数N1 = N = 100表示数塔的高度接下来用N行数字表示数塔其中第i行有个i个整数且所有的整数均在区间099内。输出描述从底层走到顶层经过的数字的最大和是多少?希望用c++编写
可以使用动态规划的方法解决这个问题。
首先定义一个二维数组dp,dp[i][j]表示从底层走到第i行第j列时经过的数字的最大和。
然后从底层开始往上计算,每一行的dp值都依赖于下一行的dp值。具体的计算方法如下:
-
初始化dp数组为数塔的底层数字。
-
从倒数第二行开始向上遍历,对于每一行的每一个数字,计算其下一行相邻的两个数字的最大值,并加上当前数字,更新dp值。
-
最终dp[0][0]就是从底层走到顶层经过的数字的最大和。
以下是C++的实现代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int N;
cin >> N;
vector<vector<int>> dp(N, vector<int>(N, 0));
for (int i = 0; i < N; i++) {
for (int j = 0; j <= i; j++) {
cin >> dp[i][j];
}
}
for (int i = N - 2; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
dp[i][j] += max(dp[i+1][j], dp[i+1][j+1]);
}
}
cout << dp[0][0] << endl;
return 0;
}
输入样例:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出样例:
30
``
原文地址: https://www.cveoy.top/t/topic/iNuP 著作权归作者所有。请勿转载和采集!