【解题报告】 SRM412_div1_250pt 和 SRM411_div2_900pt

本文分析了两道动态规划题目:SRM412_div1_250pt的Forbidden String问题,通过dp解决非禁止字符串计数;SRM411_div2_900pt的HoleCakeCuts问题,涉及蛋糕切割并考虑空心洞的影响。解题策略包括递归和状态转移方程。
摘要由CSDN通过智能技术生成

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)时间内解决。

 

typedef long long ll;

long long ForbiddenStrings::countNotForbidden(int N) {
    if(N == 1) return 3;
    if(N == 2) return 9;
     ll r[100], n[100];
//r:the forbidden string that the last 2 chars are same. n:the forbidden string that the last 2 are diff.

     r[2]=3;n[2]=6;
    for(int i = 3; i <= N; i++){
         r[i] = r[i-1]+n[i-1];
         n[i] = n[i-1]+r[i-1]*2;
    }
    return r[N]+n[N];
}

SRM411_div2_900: HoleCakeCuts

题目链接请点击这里

题目描述:有一个正方形蛋糕,其中心点坐标为(0,0),X轴正向向右,Y轴正向向上,均与正方

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值