C++---线性dp---最低通行费(每日一道算法2023.1.14)

news/2025/2/14 7:55:15/

题目:
一个商人穿过一个 N×N 的正方形的网格,去参加一个非常重要的商务活动。
他要从网格的左上角进,右下角出。
每穿越中间 1 个小方格,都要花费 1 个单位时间。
商人必须在 (2N−1) 个单位时间穿越出去。
而在经过中间的每个小方格时,都需要缴纳一定的费用。
这个商人期望在规定时间内最少费用穿越出去。
请问至少需要多少费用?

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

输入格式
第一行是一个整数,表示正方形的宽度 N。
后面 N 行,每行 N 个不大于 100 的正整数,为网格上每个小方格的费用。

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

数据范围
1≤N≤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
#include <iostream>
#include <cstring>using namespace std;
const int N = 110;
int n;
int a[N][N], f[N][N];int main()
{//读入cin >> n;for (int i = 1; i<=n; i++) {for (int j = 1; j<=n; j++) cin >> a[i][j];}//初始化DP数组f,使每个元素为最大值,以便后面的计算时比较得出较小的费用for (int i = 0; i<=n; i++) memset(f[i], 0x3f3f3f3f, sizeof f[i]);  //线性DPfor (int i = 1; i<=n; i++) {for (int j = 1; j<=n; j++) {if (i == 1 && j == 1) f[1][1] = a[1][1];  //第一个点的费用赋值else {//如果i>1,则可以从上面走过来,比较上面的路径费用和当前路径费用的大小,并取较小值if (i > 1) f[i][j] = min(f[i-1][j] + a[i][j], f[i][j]);//如果j>1,则可以从左面走过来,比较左面的路径费用和当前路径费用的大小,并取较小值if (j > 1) f[i][j] = min(f[i][j-1] + a[i][j], f[i][j]);}}}cout << f[n][n] << endl;  //输出最小费用return 0;
}

思路:
经典的线性dp问题,y式dp分析即可

1.状态表示
f[i][j] 表示从起始点到(i, j)点的所有方案费用,属性为Min

2.状态计算
由于有步数限制(2N-1),意味着我们只能从起始点向下或者向右移动,那么在进行dp计算时,对于点(i,j)我们是从这个点的上方和左侧来进行计算,也就是:
f[i][j] = Min(f[i-1][j],f[i][j-1]) + a[i][j]
代码中根据这个来进行一定的小调整即可

声明:
算法思路来源为y总,详细请见https://www.acwing.com/
本文仅用作学习记录和交流


http://www.ppmy.cn/news/12052.html

相关文章

Ambari2.7.5安装Flink1.14

文章目录下载Flink配置安装源下载ambari-flink-service服务修改配置文件创建用户和组重启Ambari登录Ambari安装Flink提交Flink任务Flink 直接单独提交到 On Yarn指定Flink在Yarn跑的容器运行Flink异常异常1异常2异常3下载Flink配置安装源 wget https://archive.apache.org/dis…

ELK日志(2)

elasticsearch群集状态颜色&#xff1a;灰色&#xff1a;未连接绿色&#xff1a;数据完整态黄色&#xff1a;副本不完整红色&#xff1a;数据分片不完整紫色&#xff1a;数据分片复制过程群集主机角色&#xff1a;主节点master&#xff1a;负责管理调度工作节点&#xff1a; 负…

C#,图像二值化(22)——局部阈值的伯恩森算法(Bernsen Thresholding)及源程序

1、局部阈值的伯恩森算法&#xff08;Bernsen Thresholding&#xff09;Bernsen方法是为图像分割开发的局部自适应二值化方法之一。在这项研究中&#xff0c;实现了Bernsen的局部自适应二值化方法&#xff0c;并对不同灰度图像进行了测试。Bernsen’s method is one of locally…

在OpenDDS应用程序中将样本记录为JSON

简介在本文中,我演示了如何 1)将样本序列化为JSON以进行日志记录 2)记录OpenDDS应用程序中写入、接收(存储在DataReader的缓存中)、读取和获取的所有样本。 这样的日志可能对调试和审计有用。OpenDDS中的相应接口称为ValueWriter和Observer。总之,这些功能允许您创建所有…

Unity 3D 三维模型简介||

Unity 3D 三维模型简介 三维模型是用三维建模软件建造的立体模型&#xff0c;也是构成 Unity 3D 场景的基础元素。 Unity 3D 几乎支持所有主流格式的三维模型&#xff0c;如 FBX 文件和 OBJ 文件等。 开发者可以将三维建模软件导出的模型文件添加到项目资源文件夹中&#xf…

【每日一道智力题】之 药瓶毒鼠鼠

题目&#xff1a; 有1000个一模一样的瓶子&#xff0c;其中有999瓶是普通的水&#xff0c;有1瓶是毒药。任何喝下毒药的生命都会在一星期之后死亡。现在你只有10只鼠鼠和1个星期的时间&#xff0c;如何检验出哪个瓶子有毒药&#xff1f; 这是一道经典的面试题&#xff0c;我们先…

【TypeScript】TS基础

TypeScript基础 文章目录TypeScript基础类型注解TypeScript类型概述TypeScript原始数据类型数组类型联合类型类型别名函数类型基本使用void 类型可选参数对象类型基本使用箭头函数形式的方法类型对象可选属性使用类型别名练习接口类型基本使用interface vs type接口继承元组类型…

2023.1.14单词打卡

cube n.立方体 detain v.扣押&#xff0c;拘留&#xff1b;耽搁 in the interest of 为了...的利益 implication n.含意&#xff0c;暗示&#xff1b;牵连&#xff1b;可能的影响 articulate v.明确表达&#xff1b;adj.善于表达的 ubiquitous adj.普遍存在的&#xff1b;…