20 October in ss

Contest

A: sum

快速读。

B: 鬼谷子的钱袋(coin)

贪心。

按照类似二进制的方式准备钱袋:1, 2, 4, 8, ... 以此装入的钱袋数目记为 (N)

如果最后剩余不足以凑齐下一个二进制位钱袋,记剩余金币价值为 (k)

(k otin {x|x=2^n, ninmathbf{N}^*}) 时,价值为 (k) 的金币另外装一个钱袋;

​当 (kin {x|x=2^n, ninmathbf{N}^*}) 时,不能同时有两个钱袋装有相同的大于 1 的金币数,此时显然将最大二进制位钱袋金币数 - 1,剩余金币另外装一个钱袋,金币数为 (k+1)

综上所述,总钱袋数为 (egin{cases}N, & N=log_2{(m+1)},Ninmathbf{N}^*, \ N+1,& ext{otherwise.} end{cases})

C: master

求最长连续公共字串,(m) 次修改机会。

可暴力 AC。

DP 解法:

定义 (f(i,j,k)) 为匹配到 A 串的 (i) 位置,B 串的 (j) 位置时,已经使用了 (k) 次修改机会的最长连续公共字串长度。

当 A 串的 (i) 位置与 B 串的 (j) 位置匹配时,可以匹配,即 (f(i,j,k)=f(i-1,j-1,k)+1)

当 A 串的 (i) 位置与 B 串的 (j) 位置不匹配时,若 (k>0),此时可以消耗一次修改机会匹配,即 (f(i,j,k)= f(i-1,j-1,k-1)+1)

对于其他情况,无法匹配,即 (f(i,j,k)=0)。对于以上取最大值记为 (f(i,j,k))

统计答案为 (max{f(i,j,k)})

D: 粉刷匠(paint)

Windy 有 (N) 条木板需要被粉刷。 每条木板被分为 (M) 个格子。 每个格子要被刷成红色或蓝色。 Windy 每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。 每个格子最多只能被粉刷一次。 如果 Windy 只能粉刷 (T) 次,他最多能正确粉刷多少格子? 一个格子如果未被粉刷或者被粉刷错颜色,就算错误粉刷。

DP。

对于每一条木板,定义 (f(i,j)) 为前 (i) 个格子粉刷 (j) 次的最大正确粉刷数目(即价值)。

易得 (f(i,j)=maxleft{f(i-1,j), maxlimits_{k=1,2,ldots,i}Big{f(i-k,j-1)+sum(i,i-k), k-sum(i,i-k)Big} ight})

其中 (sum(i,j)) 定义为在第 (i) 至第 (j) 个格子中颜色为蓝色的数目。用前缀和实现。

对于所有木板,定义 (g(i,j)) 为前 (i) 条木板粉刷 (j) 次的最大正确粉刷数目。

同理可得 (g(i,j)=maxleft{g(i-1,j), maxlimits_{k=1,2,ldots,j}Big{g(i-1,j-k)+f(m,k)Big} ight})

答案为 (maxlimits_{i=1,2,ldots,T}left{g(n,i) ight})


Post author 作者: Grey
Copyright Notice 版权说明: Except where otherwise noted, all content of this blog is licensed under a CC BY-NC-SA 4.0 International license. 除非另有说明,本博客上的所有文章均受 知识共享署名 - 非商业性使用 - 相同方式共享 4.0 国际许可协议 保护。
原文地址:https://www.cnblogs.com/greyqz/p/9830314.html