侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 675 篇文章
  • 累计创建 128 个标签
  • 累计收到 22 条评论

目 录CONTENT

文章目录

【动态规划】最低通行费「动态规划之数字三角形模型」

GabrielxD
2023-02-09 / 0 评论 / 0 点赞 / 137 阅读 / 817 字
温馨提示:
本文最后更新于 2023-02-14,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

1018. 最低通行费 - AcWing题库


一个商人穿过一个 N×NN×N 的正方形的网格,去参加一个非常重要的商务活动。

他要从网格的左上角进,右下角出。

每穿越中间 11 个小方格,都要花费 11 个单位时间。

商人必须在 (2N1)(2N-1) 个单位时间穿越出去。

而在经过中间的每个小方格时,都需要缴纳一定的费用。

这个商人期望在规定时间内用最少费用穿越出去。

请问至少需要多少费用?

注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格)。

输入格式

第一行是一个整数,表示正方形的宽度 NN

后面 NN 行,每行 NN 个不大于 100100 的正整数,为网格上每个小方格的费用。

输出格式

输出一个整数,表示至少需要的费用。

数据范围

1N1001 \le N \le 100

输入样例:

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

样例解释

样例中,最小值为 109=1+2+5+7+9+12+19+21+33109=1+2+5+7+9+12+19+21+33

解题

方法一:动态规划 数字三角形模型

思路

在不走回头路的情况下从左上角走到右下角至少需要花费 (2N1)(2N - 1) 个时间单位,而商人必须在 (2N1)(2N-1) 个单位时间穿越出去,也就是说商人只能向下或者向右走。

动态规划:

  • 状态定义:dp[i][j]dp[i][j] 表示所有从 (1,1)(1, 1) 开始走到 (i,j)(i, j) 的路径上数字和的最小值
  • 状态转移方程:dp[i][j]=min(dp[i1][j]+g[i][j],dp[i][j1]+g[i][j])dp[i][j] = \min(dp[i-1][j] + g[i][j], dp[i][j - 1] + g[i][j])
  • 初始状态:
    • dp[1][1]=g[1][1]dp[1][1] = g[1][1]
    • dp[i][1]=dp[i1][1]+g[i][1],i=2ndp[i][1] = dp[i-1][1] + g[i][1], i = 2 \dots n
    • dp[1][i]=dp[1][i1]+g[1][i],i=2ndp[1][i] = dp[1][i-1] + g[1][i], i = 2 \dots n

代码

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]);
    }
}
0

评论区