题目链接
Liesbeth and the String
方法: 动态规划推公式
题目分析
题目大意
给定一个含有n个a
的字符串,然后对这个字符串进行如下操作
- 以
a
开头,则移除前两个字母,字符串末尾补上bc
- 以
b
开头,则移除前两个字母,字符串末尾补上a
- 以
c
开头,则移除前两个字母,字符串末尾补上aaa
问,对这个字符串进行多少次操作可以使这个字符串只留下一个字符?
解析
偶数的情况是比较好推断的,n组aa
可以形成n组bc
,n组bc
可以形成n个a
,所以dp[n]=dp[n/2]+n, n为偶数
,但是奇数的情况需要推一下,以11
为例,可以推算出,dp[n]=dp[n/2*3+2]+n+1
,找到规律之后会发现,这是一个环,偶数从比他小的数推出来,奇数会从n/2*3+i+1
的数算出来,所以奇数会一直往上递归,找到一个偶数之后,再一直往下算,最终算到dp[1]
。当然,有个比较坑的地方是,函数的形参为long long
类型。
代码
1 | #include <set> |