2021.09.28pm
2021.09.28PM
| 预期 | 实际 | |
|---|---|---|
| A | 100 | 100 |
| B | 100 | 100 |
| C | 100 | 100 |
| D | 10 | 10 |
| S | 310 | 310 |
可能水,一定菜
原来之前的省选题这么水的嘛···不过也没做完就是了···
不过这次的DP确实给我人做傻了,接下来本来说先练LCA,那就转来先做DP吧···毕竟DP出现概率高得多。
A [SCOI2003]扫雷 \(\blacktriangle\)
- 一道很好玩的题,虽然答案只有0,1,2就是了。
- 首先思路自然是暴力搜索,因为感觉约束条件很多,比较容易剪枝。
- 每次根据假设的当前位置(指第二列当前位置左侧的点),上一个位置是否埋雷来推出下一个位置,如果发现不满足条件就返回上一个重新枚举。
- 由于表示状态参数较少(只用当前位置的数字,上一个位置和这个位置是否埋雷三个参数就能表示),但搜索量较大,可以考虑记忆化搜索。
- 等一下!我们刚刚说的是····记忆化搜索?换个名字它也可以叫 \(DP\) 。
- 前面也说了,状态较少,那么只与当前与之前有关,那么便有了 \(DP\) 转移方程。(dp[i][0][1]表示第i个位子目前位置有雷,上一个位置没有雷。)
\[a[i]=1
\begin{cases}
dp[i][1][0]=dp[i-1][0][1]\\
dp[i][0][1]=dp[i-1][0][0]\\
dp[i][0][0]=dp[i-1][1][0]\\
\end{cases}
\]
\[a[i]=2
\begin{cases}
dp[i][1][0]=dp[i-1][1][1]\\
dp[i][0][1]=dp[i-1][1][0]\\
dp[i][1][1]=dp[i-1][0][1]\\
\end{cases}
\]
\[a[i]=3
\begin{cases}
dp[i][1][1]=dp[i-1][1][1]\\
\end{cases}
\]
\[a[i]=0
\begin{cases}
dp[i][0][0]=dp[i-1][0][0]\\
\end{cases}
\]
- 当然,这个DP可以滚动数组优化。时间复杂度\(O(n)\)。
B 互不侵犯 \(\blacktriangle\!\blacktriangledown\)
- 又是一道DP。
- 确认不是普及组题后看数据范围就两个可能了:搜索或者状缩DP。
- 显然这道题也是可以搜索的,只不过会T挂。(大约 \(O(2^{n^2},欢迎作死)\)。
- 那么显然只剩状压DP了。(其实状压DP本身就是对搜索的一个优化)
- 我们考虑每一行的状态,再枚举上一行的状态,不矛盾的情况下进行转移。
- 时间复杂度 \(O((2^n)^2)\)
- 一 \(mol\) 优化。
- 预处理出每种成立的状态,由于状态数极少(增长速度不高于\(n^{\log_2^n-1}\)),我们可以预先处理出来,这样时间复杂度优化到很坏\(O((n^{\log_2^n-1})^2)\)。
- 当然,枚举子集的方式也可以,但是明显两个优化同时使用比较难处理。
- 滚动数组,优化空间复杂度到 \(O(k*2^n)\)。
- 扫描线。这道题显然可以,并且可以和预处理共同使用,效率更是起飞。(插个眼,在后面做状压DP小结时一定把这道题拉进去写扫描线。)
- 打表。\(O(1)\)。
C 繁华的都市 \(\blacktriangle\)
- 最小生成树板题。而且已经写过了。
- 简单介绍一种复杂度差不多但常数大到起飞的非最小生成树的解法————二分。
- 显然最少边数是 \(n-1\)
- 我们假设最长的边的长度,把所有小于等于这个长度的边都建上,看是否连通,连通说明成立。
D 最大矩阵和 \(\blacktriangle\!\blacktriangledown\)
- 这是道DP,这我想出来了的。
- 是道线性DP,而不是区间DP,是我没想到的。
- 而且我没有分类讨论···从m的范围只有两个选择其实是看得出来的!!!
- 我们先讨论m=1的情况,是之前筷子的升级版(
之前筷子也错解成区间DP)。显然有DP方程:
\(dp[i][k]=\max(dp[l][k-1]+s[i]-s[l])\)\(dp[i][k]=\max(dp[i][k],dp[i-1][k-1]\) - 而对于m=2的情况,可以分成2部分:一部分是两个m=1各算各的,另一部分是强制上下拼一起进行转移(这一块我也想到了,但是没有实现出来!!!)。时间复杂度\(O(n^3*k)\),只能说刚好卡过去···。

\(\cal {Made} \ {by} \ {YuGe}\)
浙公网安备 33010602011771号