题目
一个商人穿过一个 的正方形的网格,去参加一个非常重要的商务活动。
他要从网格的左上角进,右下角出。
每穿越中间 个小方格,都要花费 个单位时间。
商人必须在 个单位时间穿越出去。
而在经过中间的每个小方格时,都需要缴纳一定的费用。
这个商人期望在规定时间内用最少费用穿越出去。
请问至少需要多少费用?
注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格)。
输入格式
第一行是一个整数,表示正方形的宽度 。
后面 行,每行 个不大于 的正整数,为网格上每个小方格的费用。
输出格式
输出一个整数,表示至少需要的费用。
数据范围
输入样例:
5
1 4 6 8 10
2 5 7 15 17
6 8 9 18 20
10 11 12 19 21
20 23 25 29 33
输出样例:
109
样例解释
样例中,最小值为 。
解题
方法一:动态规划 数字三角形模型
思路
在不走回头路的情况下从左上角走到右下角至少需要花费 个时间单位,而商人必须在 个单位时间穿越出去,也就是说商人只能向下或者向右走。
动态规划:
- 状态定义: 表示所有从 开始走到 的路径上数字和的最小值。
- 状态转移方程:。
- 初始状态:
- ;
- ;
- 。
代码
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
in.nextToken();
int n = (int) in.nval;
int[][] dp = new int[n + 1][n + 1];
for (int i = 0; i <= n; ++i) {
dp[i][0] = dp[0][i] = Integer.MAX_VALUE;
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
in.nextToken();
int x = (int) in.nval;
if (i == 1 && j == 1) dp[i][j] = x;
else dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + x;
}
}
System.out.println(dp[n][n]);
}
}
评论区