|
|
|
@ -4,7 +4,7 @@
|
|
|
|
|
|
|
|
|
|
**[$AcWing$ $1015$. 摘花生](https://www.acwing.com/problem/content/1017/)**
|
|
|
|
|
|
|
|
|
|
二维状态表示,双重循环填充二维表,从上或右可以转移
|
|
|
|
|
二维状态表示,双重循环填充二维表,从上或左可以转移
|
|
|
|
|
```cpp {.line-numbers}
|
|
|
|
|
for (int i = 1; i <= n; i++)
|
|
|
|
|
for (int j = 1; j <= m; j++)
|
|
|
|
@ -16,26 +16,25 @@
|
|
|
|
|
f[i][j] = max(f[i - 1][j], f[i][j - 1]) + w[i][j];
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
初始值
|
|
|
|
|
**初始化**
|
|
|
|
|
```cpp {.line-numbers}
|
|
|
|
|
f[1][1] = w[1][1]; //出发点
|
|
|
|
|
```
|
|
|
|
|
① **状态表示**
|
|
|
|
|
$f[i][j]$代表走到第$(i,j)$个位置时可以获取到的最大数量和
|
|
|
|
|
**状态表示**
|
|
|
|
|
$f[i][j]$:走到第$(i,j)$个位置时可以获取到的最大数量和
|
|
|
|
|
|
|
|
|
|
② **状态转移**
|
|
|
|
|
即$f[i][j]$可以从哪些状态转移而来
|
|
|
|
|
**状态转移**
|
|
|
|
|
$f[i][j]$可以从哪些状态转移而来,答:从上方或左方过来
|
|
|
|
|
|
|
|
|
|
③ **初始值**
|
|
|
|
|
思考起点下状态表示的现实含义即可
|
|
|
|
|
**初始值**
|
|
|
|
|
思考起点状态表示的现实含义
|
|
|
|
|
|
|
|
|
|
**总结**
|
|
|
|
|
① 动态规划需要按上面的三步走,而最难的是状态表示,状态转移还好,根据题意可以推出相应的转换关系。状态表示一般是通过 **经验**,对,是 **经验**。
|
|
|
|
|
① 动态规划需要按上面的三步走,而最难的是状态表示,状态转移还好,根据题意推出相应的转换关系。状态表示靠 **经验**,对,是 **经验**。
|
|
|
|
|
|
|
|
|
|
② 初始值:不一定非得放在循环外进行初始化,也可以合并在循环内,有时放在循环内初始化反而更方便更直接。
|
|
|
|
|
|
|
|
|
|
③ 可以使用一维表示,但我个人理解不如二维的直观,最起码思路应该是先有两维再缩成一维,而不是上来就直接一维。一般的题目不会对内存有严格的限制,能用二维还是二维吧,实在卡内存再考虑降为一维。
|
|
|
|
|
② 初始值:放在循环内初始化更直接
|
|
|
|
|
|
|
|
|
|
③ 一维状态表示,我理解不如二维直观,最起码思路应该是先有两维再缩成一维,而不是上来就直接一维。一般的题目不会对内存有严格的限制,能用二维还是二维吧,实在卡内存再考虑降为一维。
|
|
|
|
|
|
|
|
|
|
**[$AcWing$ $1018$. 最低通行费](https://www.acwing.com/problem/content/1020/)**
|
|
|
|
|
与上一题基本一样,只不过是变换了下,需要你用思维转一下:$2n-1$次,就是说只能向下或向右,否则次数就不达标了。还有一点,就是需要求最小值,而不是最大值,其它的没区别
|
|
|
|
|