USACO乱做

USACO乱做

P9188 [USACO23OPEN] Pareidolia S

做了好久,感觉自己好sb
这种题有一个比较显然的想法,就是 \(f_i\) ,代表的是以 \(i\) 为结尾的所有字串的bessie个数。
首先有 \(f_i=f_{i-1}\),因为以 \(i\) 结尾的个数肯定比 \(i-1\) 多,这是很显然的。
接下来考虑多出一个 \(c_i\) 所多出的贡献,接下来有两种情况,需要分开讨论。
1.\(c_i \neq e,f_i = f_{i-1}\)
2.\(c_i = e,f_i = f_{k-1}+k\)
这里的 \(k\) 是最后一个 \(k\)\(i\) 能够有子序列bessie的位置,这个位置一定是 \(d\)
第一种情况很明显没有多出的贡献。
第二种是 \(k\)\(i\) 会多出一个bessie,对于以 \(1\)\(k\) 开头的字串都会多一个,而多出来的基础是从 \(f_{k-1}\) 的基础上转移的,很明显是对的。
code

P9124 [USACO23FEB] Bakery S

题解

感觉这题的trick没什么意思,将每个点能过符合条件的式子写出来之后运用小学六年级的知识就可以解决。
二分答案是显然的,这道题的初始值比较ex,其他没了。code

P9190 [USACO23OPEN] Pareidolia G

题解

这道题还是比较有意思的,一个比较有意思的 \(dp\) 状态优化。
首先第一个问题我们可以直接贪心解决这里不过多解释。
对于第二个问题我们可以设计一个显然的 \(dp_{i,j,k}\) 表示前 \(i\) 个,拼成了 \(j\) 个,下一个填到第 \(k\) 位。
但这样状态数就已经是 \(N^2\) 的级别了,可以说是寄了。
想想怎么压缩状态,貌似并没有太好的想法。
那我们考虑从转移优化入手,感觉是不是所有比 \(j\) 小的状态都转移向 \(j\) 有些太浪费了啊?
在所有转移的前提条件是拼出的的bessie最多。
我们就可以挖掘出一个性质,若在贪心解决第一个问题的过程中 \(i\) 正在拼出第 \(j\) 个字符串。
那么在第二个问题中,为了拼出的字符串更多,若在 \(i\) 处枚举 ,则此处所有拼出的串个数小于 \(j-2\) 左右的状态都是无用的
因为相差太多会导致拼不出最多的,在暴力 \(dp\) 的过程中也是无用的,所以说在枚举转移的过程只枚举有用的过程即可,这其实也是减少了无用状态。
在下面的代码实现中通过二元组 \(dp_i\) 代表前 \(i\) 个最多能拼出的个数和最小代价,也是简化了转移,同时精细化了转移的范围。 code

P1472 [USACO2.3] Cow Pedigrees

题解

感觉是一道比较典的关于树的形态的 \(dp\),和CF9D用的是一个trick,这种题要注意初值的赋值。

...待续

posted @ 2023-05-15 23:00  谭皓猿  阅读(127)  评论(0)    收藏  举报