动态规划-数字三角形递推算法 C语言
时间: 2023-12-17 08:28:25 浏览: 115
以下是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
#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;
scanf("%d", &n);
int triangle[MAX_N][MAX_N];
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
scanf("%d", &triangle[i][j]);
}
}
// 从倒数第二行开始向上递推
for (int i = n-2; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
triangle[i][j] += max(triangle[i+1][j], triangle[i+1][j+1]);
}
}
printf("%d\n", triangle[0][0]);
return 0;
}
```
在上述示例中,我们首先从标准输入中读取数字三角形的大小 `n`,然后使用一个二维数组 `triangle` 来存储数字三角形中的所有数字。接着,我们从倒数第二行开始向上递推,对于每个数字,选择它下一行相邻的两个数字中较大的一个加上它自己,作为从当前位置出发的最大路径和。最后输出结果即可。
这个算法的时间复杂度为 O(n^2),空间复杂度也为 O(n^2)。由于动态规划的思想,这个算法可以保证找到最优解。
阅读全文