世界名画陈列馆问题(不重复监视 )c语言代码及注释
时间: 2023-07-31 12:04:00 浏览: 135
以下是一个简单的世界名画陈列馆问题的 C 语言代码及注释:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, m, i, j;
// 读取输入
scanf("%d %d", &n, &m);
// 根据输入创建二维数组
int **paintings = (int **)malloc(n * sizeof(int *));
for (i = 0; i < n; i++) {
paintings[i] = (int *)malloc(m * sizeof(int));
}
// 读取每幅画的价值
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
scanf("%d", &paintings[i][j]);
}
}
// 计算最大价值
int **dp = (int **)malloc(n * sizeof(int *));
for (i = 0; i < n; i++) {
dp[i] = (int *)malloc(m * sizeof(int));
}
dp[0][0] = paintings[0][0];
for (i = 1; i < n; i++) {
dp[i][0] = dp[i-1][0] + paintings[i][0];
}
for (j = 1; j < m; j++) {
dp[0][j] = dp[0][j-1] + paintings[0][j];
}
for (i = 1; i < n; i++) {
for (j = 1; j < m; j++) {
dp[i][j] = paintings[i][j] + ((dp[i-1][j] > dp[i][j-1]) ? dp[i-1][j] : dp[i][j-1]);
}
}
// 输出结果
printf("%d\n", dp[n-1][m-1]);
// 释放内存
for (i = 0; i < n; i++) {
free(paintings[i]);
}
free(paintings);
for (i = 0; i < n; i++) {
free(dp[i]);
}
free(dp);
return 0;
}
```
注释:
- 第 4 至 7 行定义了需要用到的变量。
- 第 10 至 14 行根据输入创建了一个二维数组,用于存储每幅画的价值。
- 第 17 至 23 行读取每幅画的价值。
- 第 26 至 44 行计算最大价值,使用动态规划算法,将结果存储在一个二维数组中。
- 第 47 行输出最大价值。
- 第 50 至 62 行释放动态分配的内存。
阅读全文