用C语言实现动态规划——数塔问题
时间: 2023-07-31 13:12:49 浏览: 74
数塔问题是一个经典的动态规划问题,其基本形式是:给定一个由 n 行数字组成的数塔,从顶部出发,每次只能向下一行相邻的两个数字移动,求从顶部到达底部的最大总和。下面是一个用 C 语言实现的数塔问题的动态规划算法的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 100
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int n;
int nums[MAX_N][MAX_N] = {0};
int dp[MAX_N][MAX_N] = {0};
scanf("%d", &n);
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
scanf("%d", &nums[i][j]);
}
}
for (int i = 0; i < n; i++) {
dp[n - 1][i] = nums[n - 1][i];
}
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]) + nums[i][j];
}
}
printf("%d\n", dp[0][0]);
return 0;
}
```
该程序使用动态规划算法实现数塔问题的解题过程,其中 `max` 函数用于比较两个数的大小,`nums` 数组用于存储数塔的数据,`dp` 数组用于存储动态规划的中间结果。程序中的数塔示例是从标准输入读入的,其中第一行是数塔的高度 n,接下来 n 行是数塔的数据。程序输出的是从顶部到达底部的最大总和。