上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径把路径上面的数加起来可以得到一个和你的任务就是找到最大的和。路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外向左下走的次数与向右下走的次数相差不能超过 1。输入描述输入的第一行包含一个整数 N 1 leq N leq 100N 1≤N≤100表示三角形的行数。下面的 NN 行给出数字三角
你的代码有误是因为在计算dp[i][t]时,对于t不等于0和i的情况,你使用的是max(dp[i-1][t]+V[i][t], dp[i-1][t-1]+V[i][t]),这样会导致路径走到当前位置时不一定是从上一行的左边或右边走过来的。应该根据题目要求,路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数,所以要分别计算从左边和右边走过来的情况,然后取较大的值。修改后的代码如下:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int N;
cin >> N;
vector<vector<int>> V(N, vector<int>(N));
vector<vector<int>> dp(N, vector<int>(N));
for (int i = 0; i < N; i++) {
for (int t = 0; t <= i; t++) {
cin >> V[i][t];
}
}
dp[0][0] = V[0][0];
for (int i = 1; i < N; i++) {
for (int t = 0; t <= i; t++) {
if (t == 0) {
dp[i][t] = dp[i - 1][t] + V[i][t];
} else if (t == i) {
dp[i][t] = dp[i - 1][t - 1] + V[i][t];
} else {
dp[i][t] = max(dp[i - 1][t] + V[i][t], dp[i - 1][t - 1] + V[i][t]);
dp[i][t] = max(dp[i][t], dp[i - 1][t + 1] + V[i][t]);
}
}
}
int maxSum = 0;
for (int t = 0; t < N; t++) {
maxSum = max(maxSum, dp[N - 1][t]);
}
cout << maxSum;
return 0;
}
以上代码的思路是从上往下计算每个位置的最大和,并且保存在dp数组中。最后,遍历最后一行的所有位置,取其中的最大值作为答案
原文地址: https://www.cveoy.top/t/topic/hIc1 著作权归作者所有。请勿转载和采集!