SRM412_div1_250: Forbidden String
题目链接请点击这里。
题目描述:只考虑由A,B,C三字母组成的字符串,若字符串S存在三个连续的字母使得其中一个为A,一个为B,一个为C,则称S为forbidden string。例如,BAACAACCBAAA 是Forbidden String,而AABBCCAABB 不是。
给你字符串长度n,要求你计算有多少个not forbidden字符串。1<=n<=30。
解析1:可模拟字符串从长度为0开始不断往后append字母至长度为n的过程。当前位可添加的字母仅由其前2位决定(如果长度>=2的话,若长度<2可自由添加),而其前2位可能的情况有以下几种:AA,BB,CC,AB,AC,BC,BA,CA,CB
分别用1,2,3表示A,B,C的话,则可以用不大于40的几个数来表示所有可能的前缀。另外n的范围较小,因此首先想到用dp解决。dp[a][b]表示前a位的末2位对应整数为b时的非forbidden string数量(b=11,22,33,12,13,23,21,31,32)。则根据b的情况进行讨论,进行状态转换。当b对应的前缀其2位均相同时,则可添加A,B,C三种。当b对应的前缀其2位不同时,则可添加2种,具体哪2种由b决定。例如b=BA时,可添加A,B两种,不能添加C。
解析2:在解析1的基础上,我们知道最终not forbidden的字符串只由两类字符串组成:末2位相同和末2位不同的字符串,用r[t]表示长度为t且末2位相同的非forbidden字符串。用n[t]表示末2位不相同的非forbidden字符串。则r[t], n[t]与r[t-1], n[t-1]之间存在什么样的关系?由解析1可很容易地推出:
r[t] = r[t-1]+n[t-1];
n[t]=r[t-1]*2+n[t-1];
由此可在O(n)时间内解决。
|
SRM411_div2_900: HoleCakeCuts
题目链接请点击这里。
题目描述:有一个正方形蛋糕,其中心点坐标为(0,0),X轴正向向右,Y轴正向向上,均与正方