Atcoder Educational DP Contest 做题记录
E
思路
\(W\) 大范围,\(SumV\) 小范围的背包,令 \(f[i]\) 表示价值为 \(i\) 时最小容量,转移方程 \(f[j]=\min(f_j,f_{j-v_i}+w_i)\) 。
F
反思
输出方案数的话, \(dp\) 时记录该状态时从哪里转移来的,最后从末状态递归输出。
I
思路
\(n \le 3000\),考虑二维 \(dp\),每次加入一个新硬币来遍历一遍。令 \(f_{i,j}\) 表示前 \(i\) 个 硬币时有 \(j\) 个正面朝上,则最终答案为 $$\sum\limits_{i=n/2+1} ^nf_{n,i} $$
此时遍历至 \(f_{i,j}\),对于 \(i\),有正反两种情况。
- 硬币 \(i\) 为正,则上一个硬币时已有 \(j\) 个向上,贡献为 \(f_{i-1,j}*(1-p[i])\)
- 硬币 \(i\) 为反,则上一个硬币时有 \(j-1\) 个向上,贡献为 \(f_{i-1,j-1}*p[i]\)
综上,转移方程 \(f_{i,j}=f_{i-1,j}*(1-p[i])+f_{i-1,j-1}*p[i]\) 。
关于边界,\(f_{0,0}\) 初始为 \(1\) ,代表一个都不扔时,没有硬币朝上是必然事件。
J
思路
吃完所有寿司总共需要 \(\sum\limits_{i=1}^na_i\) 次,于是可以拆分成这么多个状态。
正常的做法是令 \(f_i\) 表示已吃 \(i\) 个寿司时距离吃完的期望步数。此时对这一步选的这个盘子,如果它当前剩下一个寿司,两个寿司……,下一步时的盘子情况是不同的(例如 2 1 可以吃一次后可以是 1 1 或 2 0,这两种状态的期望步数是不同的),所以每个不同的状态需要单独考虑,那么
但是这样有些状态会重复考虑,

浙公网安备 33010602011771号