动态规划-数字三角形递推算法 C语言
时间: 2023-12-17 20:28:25 浏览: 136
以下是C语言实现数字三角形递推算法的代码和注释:
```c
#include <stdio.h>
#define max_n 100
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int n, d[max_n + 5][max_n + 5] = {0}; // 定义数字三角形的行数n和二维数组d
scanf("%d", &n); // 输入数字三角形的行数n
for (int i = 1; i <= n; i++) { // 逐行输入数字三角形
for (int j = 1; j <= i; j++) {
scanf("%d", &d[i][j]);
}
}
for (int i = n - 1; i >= 1; i--) { // 逆序枚举每一行
for (int j = 1; j <= i; j++) { // 逐列计算d[i][j]
d[i][j] += max(d[i + 1][j], d[i + 1][j + 1]); // 根据递推公式计算d[i][j]
}
}
printf("%d\n", d[1][1]); // 输出数字三角形的最大和
return 0;
}
```
相关问题
c语言数字三角形(动态规划)
在C语言中,数字三角形(也称为帕斯卡三角形或杨辉三角)是一个经典的动态规划问题,它可以通过递推算法来构建。这个三角形的特点是每一行都是由前一行的数字相加得到的,最开始的两行通常包含数字1。
以下是一个简单的动态规划方法来生成数字三角形:
```c
#include <stdio.h>
// 动态规划函数,返回给定行的第列值
int getTriangleValue(int row, int col) {
if (col > row) return 0;
if (col == 0 || col == row) return 1; // 边界条件:第一行和对角线上的数都是1
// 前一行的值
int prevRow = getTriangleValue(row - 1, col);
// 返回当前行的值,根据动态规划规则计算
return getTriangleValue(row - 1, col - 1) + prevRow;
}
// 主函数,打印数字三角形
void printTriangle(int rows) {
for (int i = 0; i <= rows; i++) {
for (int j = 0; j <= i; j++) {
printf("%d ", getTriangleValue(i, j));
}
printf("\n");
}
}
int main() {
int rows = 5; // 指定要打印的行数
printTriangle(rows);
return 0;
}
```
当你运行这段代码,它会输出指定行数(如5)的帕斯卡三角形。
数字三角形给出具体路径c语言
### 数字三角形路径算法 C语言 实现
以下是基于动态规划思想实现的数字三角形路径算法的C语言代码。此方法通过自底向上的方式逐步构建最优解矩阵 `b`,最终得到从顶部到底部的最大路径和。
#### 动态规划核心思路
1. 定义二维数组 `b[i][j]` 表示从 `(i, j)` 到底部的最大路径和。
2. 初始化最后一行为原数组的最后一行值,即 `b[n-1][j] = a[n-1][j]`。
3. 使用递推关系式更新其他元素:
\[
b[i][j] = \max(b[i+1][j], b[i+1][j+1]) + a[i][j]
\]
#### 完整代码实现
```c
#include <stdio.h>
#define MAXN 100 // 假设最多有100层
int main() {
int n;
printf("请输入数字三角形的层数: ");
scanf("%d", &n);
int a[MAXN][MAXN]; // 存储原始三角形数据
int b[MAXN][MAXN]; // 存储最大路径和的结果
// 输入数字三角形
printf("请输入数字三角形:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
scanf("%d", &a[i][j]);
}
}
// 初始化最后一行
for (int j = 0; j < n; j++) {
b[n - 1][j] = a[n - 1][j];
}
// 自底向上计算最大路径和
for (int i = n - 2; i >= 0; i--) { // 从倒数第二行开始
for (int j = 0; j <= i; j++) {
b[i][j] = (b[i + 1][j] > b[i + 1][j + 1] ? b[i + 1][j] : b[i + 1][j + 1]) + a[i][j];
}
}
// 输出结果
printf("从顶到底的最大路径和为:%d\n", b[0][0]);
return 0;
}
```
#### 示例运行说明
假设输入如下数字三角形:
```
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
```
程序会输出:
```
从顶到底的最大路径和为:30
```
解释过程如下:
- 最优路径为 `7 -> 8 -> 4 -> 6 -> 5`,其总和为 \(7 + 8 + 4 + 6 + 5 = 30\)。
---
### 关键点分析
1. **空间复杂度优化**:如果仅需保存当前行和下一行的状态,则可以进一步降低空间复杂度至 O(n)[^1]。
2. **时间复杂度**:由于每一对父子节点只访问一次,因此总体时间为 O(n²),其中 n 是三角形的高度[^2]。
---
阅读全文
相关推荐












