数字三角形问题
题目描述
下图给出了一个数字三角形,请编写一个程序,计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。
(1)每一步可沿左斜线向下或右斜线向下
(2)1 < 三角形行数 < 100
(3)三角形数字为0,1,…99
输入
第1行是输入整数,表示三角形行数n,然后是n行数
输出
输出最大值。
Input
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
Output
30
思路
核心为动态规划思想
利用数组dp记录子问题的解
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define max_size 110
int max(int x, int y)
{
return x > y ? x : y;
}
int main()
{
int n, tr[max_size][max_size],dp[max_size][max_size];
scanf_s("%d", &n);
for (int i = 1;i < n + 1;i++)
{
for (int j = 1;j <=i;j++)
{
scanf_s("%d", &tr[i][j]);
}
}
memset(dp, 0, sizeof(dp));
dp[1][1] = tr[1][1];
for (int i = 2;i < n + 1;i++)
{
for (int j = 1;j <=i;j++)
{
if (j == 1)
{
dp[i][j] = dp[i-1][j]+tr[i][j];
}
else if (j==i)
{
dp[i][j] = dp[i - 1][j - 1] + tr[i][j];
}
else
{
dp[i][j] = max(dp[i-1][j - 1] + tr[i][j], dp[i - 1][j] + tr[i][j]);
}
}
}
int maxNumber = dp[n][1];
for (int i = 1;i < n+1;i++)
{
if (dp[n][i] > maxNumber)
maxNumber = dp[n][i];
}
printf("%d", maxNumber);
return 0;
}