- Beautiful Sequence
- Beautiful Mirrors
- Beautiful Bracket Sequence (easy version)
Beautiful Sequence
\[ Time Limit: 1000 ms\quad Memory Limit: 256 MB \]
首先我们可以考虑到 \(0\) 只能 和 \(1\) 放在一起、\(3\) 只能和 \(2\) 放在一起,那么我们想办法先把 \(0\) 和 \(3\) 凑出来,最后就剩下 \(1\) 和 \(2\) 了,我们只要把他们放在一起就可以了。
所以我们可以贪心考虑三个 \(string\),分别长成 \(0101...0101\)、\(2323...2323\)、\(1212...1212\) 这样的,那么现在的问题就是把这三个 \(string\) 合并起来,那么完全可以把他们全排列并二进制枚举每个 \(string\) 是否翻转,然后 \(check\) 一遍。
view
#include
Beautiful Mirrors
\[ Time Limit: 2000 ms\quad Memory Limit: 256 MB \]
首先令 \(dp[i]\) 表示从第 \(i\) 天到结束所需要的期望天数,为了方便,可以假设 \(n+1\) 天为结束位置,那么 \(dp[n+1] = 0\)。
对于 \(1<=i<=n\),有 \(dp[i] = \frac{p_i*dp[i+1] + (100-p_i)*dp[1]}{100}+1\)
然后一直带进去,最后可以发现 \(dp[1]\) 可以表示为
\[ dp[1] = A*dp[1] + B + 1 \]
其中 \(A、B\) 都是具体的数字,那么就得到的 \(dp[1]\) 的值。
view
#include
Beautiful Bracket Sequence (easy version)
\[ Time Limit: 2000 ms\quad Memory Limit: 256 MB \]
令 \(dp[i][j]\) 表示从 \(i\) 到 \(j\) 区间内,所有情况的括号最深深度之和。
转移的时候令 \(dp[i][i] = 0\),\(dp[i][i+1]\) 为 \(s[i]\) 和 \(s[i+1]\) 能否组成 \(()\)。
对于更大的区间,只需要考虑最左和最右端点就可以。
- 如果\(s[i]\) 可以放成 \((\)
- 如果 \(s[j]\) 可以放成 \((\),\(dp[i][j] += dp[i][j-1]\)
- 如果 \(s[j]\) 可以放成 \()\),\(dp[i][j] += dp[i+1][j-1] + 2^k\),\(k\) 代表 \([i+1,j-1]\) 这段内 \(?\) 的个数。
- 如果 \(s[i]\) 可以放成 \()\)
- 如果 \(s[j]\) 可以放成 \((\),\(dp[i][j] += dp[i+1][j-1]\)
- 如果 \(s[j]\) 可以放成 \()\),\(dp[i][j] += dp[i+1][j]\)
然后有一部分会被重复计算,也就是 \(dp[i+1][j-1]\) 这一段,所以只要顺便记录一下转移过程中计算了几次这一段,然后扣掉多计算的就可以了。
view
#include