题目名称:开学趣闻之美食诱惑时间限制:1000ms内存限制:256M
题目描述
小艺酱又开学了,可是在上学的路上总会又各种意想不到的美食诱惑让小艺酱迟到。 假设小艺酱家到学校是一个n*n的矩阵。 每个格子包含一个诱惑值p,诱惑着小艺,让她迟到。 小艺位于矩阵的左上角,学校在矩阵的右下角落。 小艺想知道自己到达学校所要经历的最小诱惑值是?
输入描述:
第一行输入整数n。(1<=n<=100) 以下n行每行有n个整数表示诱惑值。(1<=p<=100)
输出描述:
输出到达学校需要经历的最小诱惑值。
示例
示例1
输入3
1 3 7
6 2 1
9 8 0复制
输出7复制
提示
这段代码实现了一个动态规划算法来计算一个正方形矩阵中从左上角到右下角的最小诱惑值。下面是代码的大致解释:
-
首先定义了一个
min
函数,用于返回两个数中较小的一个。 -
然后定义了一个
getMinTemptation
函数,接受一个整数n
和一个n x n
的矩阵作为输入,并返回最小诱惑值。 -
在
getMinTemptation
函数中,创建了一个dp
数组用于存储每个位置的最小诱惑值。 -
初始化起点
(0, 0)
的诱惑值为矩阵中的值matrix[0][0]
。 -
然后,计算第一行的每个位置的诱惑值,依次累加上一位置的诱惑值和当前位置的值。
-
接着,计算第一列的每个位置的诱惑值,依次累加上一位置的诱惑值和当前位置的值。
-
最后,计算其他位置的诱惑值。对于每个位置
(i, j)
,选择上方和左方诱惑值中较小的一个,并加上当前位置的诱惑值。 -
返回最右下角位置
(n-1, n-1)
的诱惑值作为结果。 -
主函数中读取输入,调用
getMinTemptation
函数计算最小诱惑值,并输出结果。
#include <stdio.h>
#define MAX_SIZE 100
int min(int a, int b) {
return (a < b) ? a : b;
}
int getMinTemptation(int n, int matrix[MAX_SIZE][MAX_SIZE]) {
int dp[MAX_SIZE][MAX_SIZE];
// 初始化起点的诱惑值
dp[0][0] = matrix[0][0];
// 计算第一行的dp值
for (int j = 1; j < n; j++) {
dp[0][j] = dp[0][j-1] + matrix[0][j];
}
// 计算第一列的dp值
for (int i = 1; i < n; i++) {
dp[i][0] = dp[i-1][0] + matrix[i][0];
}
// 计算其他位置的dp值
for (int i = 1; i < n; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + matrix[i][j];
}
}
return dp[n-1][n-1];
}
int main() {
int n;
int matrix[MAX_SIZE][MAX_SIZE];
// 读取输入
scanf("%d", &n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &matrix[i][j]);
}
}
// 计算最小诱惑值
int result = getMinTemptation(n, matrix);
// 输出结果
printf("%d\n", result);
return 0;
}