这个问题也是简单dp问题
题意:
给定一个由n行数字组成的数字三角形,如下图所示:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大(
每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数)。
输入:先输入三角形的行数n,以后的每一行都是该行中的数。
输出:从顶到底的一条路径使的经过的数字总和最大。(这个例子是30:7+3+8+7+5)
解题思路:这个也是简单的dp,需要从底向上考虑,用二维数组dp[i][j]和a[i][j]。a[i][j]是对应的三角形数,dp[i][j]是到达第i行第j个数的最大路径,这里的状态转移方程是从倒数第二行开始,dp[n-1][j]=max(a[n-1][j]+dp[n+1][j],a[n-1][j]+dp[n+1][j+1])
很好理解哒附上代码~
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
int dp[200][200], a[200][200];
int n;
int max(int a, int b)
{
if (a >= b) return a;
else return b;
}
int main()
{
scanf("%d", &n);
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
scanf("%d", &a[i][j]);
}
}
for (int j = 1; j <= n; j++)
{
dp[n][j] = a[n][j];
}
for (int i = n - 1; i >= 1; i--)
{
for (int j = 1; j <= i; j++)
{
int max1 = dp[i + 1][j];
int max2 = dp[i + 1][j + 1];
int ma = max(max1, max2);
dp[i][j] = a[i][j] + ma;
}
}
printf("%d\n", dp[1][1]);
return 0;
}
一起学动态规划~有问题私聊哦~ 么么哒