首页 > 其他分享 >1928.规定时间内到达终点的最小话费,题解

1928.规定时间内到达终点的最小话费,题解

时间:2024-09-15 19:34:58浏览次数:13  
标签:INFTY INT 题解 话费 constexpr static MAX 1928 maxTime

1928. 规定时间内到达终点的最小花费 - 力扣(LeetCode)

有点难,参考官方题解代码:

利用了动态规划思想,逐步计算从起点到各个城市在不同时间下的最小费用。

 1.代码解释,涉及,static关键字,constexpr关键字,INT_MAX除以2赋值的含义

static constexpr int INFTY = INT_MAX / 2;

 1. **`static` 关键字**:
- **`static`** 表示这个变量具有**静态存储周期**,意味着它只在内存中存储一份,并且生命周期从程序开始到程序结束。它也意味着该变量的作用域限制在声明它的类或文件中,不会被外部直接访问。通常用在类或函数内部,或者在全局作用域中限制变量的可见性。

 2. **`constexpr` 关键字**:
- **`constexpr`** 表示这是一个**常量表达式**,在编译时就能确定它的值。与 `const` 类似,但它更严格,要求编译器在编译时对表达式求值。换句话说,`constexpr` 变量必须能够在编译阶段被计算出其值。

 3. **`int INFTY`**:
- **`INFTY`** 是定义的一个整数常量,表示无穷大。这个常量是整型(`int`),并且通过 `static constexpr` 限定,它的值在编译时确定,并且在类或文件的整个生命周期内都有效。

 4. **`INT_MAX / 2`**:
- **`INT_MAX`** 是在 `climits` 头文件中定义的一个宏,表示 **int 类型能够表示的最大值**,通常是 `2,147,483,647`(对于 32 位的 `int` 类型)。
- 使用 `INT_MAX / 2` 而不是 `INT_MAX` 的原因是为了防止在执行某些算法时,防止数值溢出。很多时候我们在图算法或者动态规划中使用 "无穷大" 来表示不可达的节点或状态。如果直接使用 `INT_MAX`,在计算时(比如加权图中更新路径长度时)可能会导致数值溢出(因为超过了 `INT_MAX` 的范围)。而使用 `INT_MAX / 2` 可以让值足够大,但避免溢出的风险。

总结:
这行代码定义了一个 **`INFTY`** 常量,表示一个**非常大的值**(接近于 `INT_MAX`,但小一半),用于表示类似“无穷大”的含义,常见于**图算法**(如 Dijkstra 最短路径)或者动态规划中,作为初始化的最大值。它使用了 `static constexpr`,所以它的值是在编译时就确定的,且在整个程序生命周期中只会存在一份。

2.

vector<vector<int>> f(maxTime + 1, vector<int>(n, INFTY));

这一行代码的作用是定义一个二维动态数组 `f`,其中 `f[t][i]` 表示在使用了 `t` 时间时,能够到达城市 `i` 的最小费用。详细解释如下:

 1. **定义二维数组 `f`**:

- `f` 是一个大小为 `(maxTime + 1) x n` 的二维数组。
- 第一维:时间,从 `0` 到 `maxTime`,共 `maxTime + 1` 行,表示可以使用的时间。
- 第二维:城市,从 `0` 到 `n-1`,表示共有 `n` 个城市。

 2. **`vector<int>(n, INFTY)`**:
- 这一部分表示创建一个长度为 `n` 的一维数组,每个元素都初始化为 `INFTY`。
- `n` 是城市的数量。
- `INFTY` 是一个表示“无穷大”的值,表示无法在当前状态下到达某个城市。
- 也就是一开始所有城市的通行费用都设置为一个极大值(表示不可能到达)。

 3. **构建二维数组**:
- `vector<vector<int>> f(maxTime + 1, ...)`:创建 `maxTime + 1` 行,每一行是一个长度为 `n` 的数组,每个元素初始为 `INFTY`。
- 因此,`f` 是一个二维数组,表示在不同时间下到达不同城市的最小通行费用。每个城市在每个时间点的初始状态都是不可达(`INFTY`)。

 

 

 

标签:INFTY,INT,题解,话费,constexpr,static,MAX,1928,maxTime
From: https://www.cnblogs.com/spp20/p/18415548

相关文章

  • Hetao P1391 操作序列 题解 [ 绿 ] [ 二维线性 dp ]
    操作序列:简单的二维dp。观察我们每次操作可以让\(x\)变为\(2x-1\),或者当\(x\)为奇数时让\(x\)变为\(\frac{x+1}{2}\)。显然,执行第一种操作,会使\(x\)变成奇数。那一旦我们连续执行两次操作,\(x\)就会变为:\[\frac{(2x+1)-1}{2}=\frac{2x}{2}=x\]也就是说,当\(x\)......
  • 语言 题解
    语言题解本题其实没有什么好说的,主要是提供一种强大的,神秘的,诡异的,跑得飞快的,逆天的,唐诗的双\(\log\)做法首先考虑将答案分类,分成跨过这个语言的lca的和没跨过的对于没跨过的,可以发现就是对于每个点,求能扩展到的深度最低的节点,这个直接暴力做就是\(O(n)\)的,所以说我们直......
  • 题解:AT_pakencamp_2019_day3_d パ研軍旗
    题意简述给定\(5\)行\(N\)列的网格,每个格子有四种可能的颜色。要使网格中每一列的颜色都一样但不能是黑色,并且相邻两列的颜色不相同。问最少改变多少个格子的颜色能满足要求。思路分析为方便处理,把给定的红色、蓝色、白色、黑色分别转成数字\(1,2,3,4\)。考虑dp。不妨......
  • 题解:AT_abc371_c [ABC371C] Make Isomorphic
    题目大意有两个简单无向图,你每一次可以给第二个图添上或去掉一条边,有相应花费,问将两个图变为同构最少需要花费多少钱。思路观察数据范围,可以发现NNN非常小,可以考虑枚......
  • 「KDOI-06-S」题解
    T2树上异或题面分析树形DP题考虑一颗子树内部的某种割边方式,假设其被分为\(n\)个连通块,每个连通块的权值分别为\(a_1,a_2,\dots,a_n\),那么该子树在这种割边方式下对答案的贡献就为\(\prod_{i=1}^{n}a_i\)。因此就可以从叶子向根不断合并,求出每种割边状态的值,时......
  • 【洛谷 P1596】[USACO10OCT] Lake Counting S 题解(深度优先搜索)
    [USACO10OCT]LakeCountingS题面翻译由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个的网格图表示。每个网格中有水(W)或是旱地(.)。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,......
  • Codeforces Round 972 (Div. 2) 2005C. Lazy Narek 题解
    原题链接:https://codeforces.com/contest/2005/problem/C看了教程发现都是用dp做的,在这里分享一个差不多的SPFA的思路(赛场上忘了Dijkstra不能有负边所以炸了)时间复杂度与dp同样是O(nm)形式化题意和翻译:有n个长度为m的字符串,你可以选择或不选择来拼接它们,但是不能更改字符串的......
  • 食物链题解
    双倍经验:P2024[NOI2001]食物链当问题要求维护一些对立的关系时(朋友、敌人),就可以用种类并查集实现。因为有三种关系所以并查集的数组要开三倍空间,第一倍空间存同类关系,第二倍存捕食关系,第三倍存被捕食关系。注意:一的猎物的猎物就是一的天敌,其他就可以直接并查集维护即可。注......
  • [ABC371D] 1D Country 题解
    这题,怎么说呢,\(STL\)大法好。前置芝士:lower_pound函数在结构体上的使用。那其实这题便是一个二分前缀和的水题了。结构体存储每个村庄的距离\(x\),人口\(d\)。对于每个输入的\([l,r]\)二分查找其对应的村庄,进行一次答案的统计,输出即可。代码:#include<bits/stdc++.......
  • 【LGR-200-Div.4】洛谷入门赛 #27 A-H题解
    A#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;mt19937rnd(time(0));#defineintlonglongtypedeftuple<int,int,int>tp;#definexfirst#defineysecondtypedefpair<int,int>pii;typedefpair<double,double>......