main
黄海 1 year ago
parent 517eed9098
commit bc505892bf

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1 @@
https://mp.weixin.qq.com/s?__biz=MzIwMzUyNTU4OA==&mid=2247486050&idx=1&sn=52183a67416c516a17cadcd479a2394a&chksm=96cf56d9a1b8dfcf7c4861b9e34d63962c2f6fbcf6b9390a8408f3599c043b111e15073d24ed&scene=27

@ -48,16 +48,22 @@ $1≤T≤100,1≤R,C≤100,0≤M≤1000$
### 二、$DP$分析
**状态表示**
$f[i][j]$: 所有从$(1,1)$ 走到 $(i,j)$的路线 中 **花生数量之和** **最大值**
$f[i][j]$: 小猫可在出现的每个位置$(x,y)$, **策略**:面向答案编程,
从$(1,1)$走到$(x,y)$有多条路线,我们设$f(x,y)$为所有路线中 **花生数量之和** **最大值**
**状态转移**
$$\large f[i][j]=max(f[i-1][j],f[i][j-1])+w[i][j]$$
**填充顺序**
观察状态转移方程,发现:
① 由于是一个二维状态表示,所以可以理解为是一个二维表,需要对二维表进行数据填充。
② 第$i$行依赖第$i-1$行,第$j$列,依赖$j-1$列,所以,考虑从上到下,从左到右,就是先处理$i,j$中小的,再处理大的,可以形成递推依赖。
**初始值**
观察状态转移方程,知道$f[1][1]=w[1][1]$
**答案**
$f[n][m]$
最终我们要计算的是在东南角时可以获取到的最多花生数,即$f[n][m]$
### 三、二维$DP$写法
@ -97,7 +103,7 @@ int main() {
```
### 四、一维数组写法
### 四、一维$DP$写法
从二维降一维时,发现每个数据,只依赖于它上一行的同列数据,和同一行的左侧数据,也就是可以概括为依赖于 **左+上**。而采用一维进行记录状态时,$f[i-1]$表示的是$f[i]$的左侧供给数据,$f[i]$描述的是上一行的同列供给数据,两者$PK$就可以覆盖掉当前值。
@ -159,6 +165,8 @@ int main() {
return 0;
}
```
不使用记忆化的深搜是不可以原谅的,速度太慢!究其原因应该是存在大量重复计算,比如$dfs(3,5)$,每次都计算一遍,性能要是好了就怪了,也就是说,我们如果想要使用$dfs$,就一定要思考使用数组完成记忆化,否则就别用。
### 六、深搜+记忆化
```cpp {.line-numbers}
#include <bits/stdc++.h>

Loading…
Cancel
Save