LQ0072 数字三角形DP
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0072 数字三角形DP相关的知识,希望对你有一定的参考价值。
题目来源:蓝桥杯2020初赛 C++ C组I题
题目描述
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。
对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数。
此外,向左下走的次数与向右下走的次数相差不能超过1。
输入格式
输入的第一行包含一个整数N (1 < N ≤ 100),表示三角形的行数。
下面的N 行给出数字三角形。数字三角形上的数都是0 至100 之间的整数。
输出格式
输出一个整数,表示答案。
输入样例
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出样例
27
问题分析
这是一个数塔问题的变化,增加了条件“向左下走的次数与向右下走的次数相差不能超过1”。
用DP来解决,最后需要做进一步判断计算。
AC的C语言程序如下:
/* LQ0072 数字三角形 */
#include <stdio.h>
#include <string.h>
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define N 100 + 1
int a[N][N];
int main()
int n;
scanf("%d", &n);
memset(a, 0, sizeof a);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++)
scanf("%d", &a[i][j]);
a[i][j] += MAX(a[i - 1][j - 1], a[i - 1][j]);
if(n & 1)
printf("%d\\n", a[n][n / 2 + 1]);
else
printf("%d\\n", MAX(a[n][n / 2 + 1], a[n][n / 2]));
return 0;
以上是关于LQ0072 数字三角形DP的主要内容,如果未能解决你的问题,请参考以下文章