cowboys(dp+递归)

  • 问题描述
      一个间不容发的时刻:n个牛仔站立于一个环中,并且每个牛仔都用左轮手枪指着他旁边的人!每个牛仔指着他顺时针或者逆时针方向上的相邻的人。正如很多西部片那样,在这一刻,绳命是入刺的不可惜……对峙的场景每秒都在变化。每秒钟牛仔们都会分析局势,当一对相邻的牛仔发现他们正在互指的时候,就会转过身。一秒内每对这样的牛仔都会转身。所有的转身都同时在一瞬间发生。我们用字母来表示牛仔所指的方向。“A”表示顺时针方向,“B”表示逆时针方向。如此,一个仅含“A”“B”的字符串便用来表示这个由牛仔构成的环。这是由第一个指着顺时针方向的牛仔做出的记录。例如,牛仔环“ABBBABBBA”在一秒后会变成“BABBBABBA”;而牛仔环“BABBA”会变成“ABABB”。 这幅图说明了“BABBA”怎么变成“ABABB” 一秒过去了,现在用字符串s来表示牛仔们的排列。你的任务是求出一秒前有多少种可能的排列。如果某个排列中一个牛仔指向顺时针,而在另一个排列中他指向逆时针,那么这两个排列就是不同的。
  • 输入格式
    输入数据包括一个字符串s,它只含有“A”和“B”。
  • 输出格式
    输出你求出来的一秒前的可能排列数。
  • 数据规模和约定
      s的长度为3到100(包含3和100)
  • 样例输入
    BABBBABBA
    样例输出
    2
    样例输入
    ABABB
    样例输出
    2
    样例输入
    ABABAB
    样例输出
    4
  • 样例说明
    测试样例一中,可能的初始排列为:"ABBBABBAB"和 “ABBBABBBA”。
    测试样例二中,可能的初始排列为:“AABBB"和"BABBA”。

由于字符串是环,我们可以指定任意位为起始字符,如果字串长度为二,我们知道AB一定是变换而来,AA/BB一定没有发生变化,而BA可以变化得来也可以不变,且BA变化一定不与他们的前一位或者后一位有关系,所以我们将起始字符放置在BA处,讨论变化情况和不变情况下的种类和即可。dp[i][0]表示当前位不和前一位变换时的种数,dp[i][1]表示当前位和前一位变化时的种数;只考虑当前位和前一位的转换,不考虑和后一位的转换。初时值确定:
dp[start][0] = 1;(第一位不能发生变化,至少有两位才能发生改变)
dp[start][1] = 0;状态转移方程确定:
①当前为B,前者为A(AB)
dp[st][0]=dp[st-1][1] (AB中A是变换得来)
dp[st][1]=0 (不可能只由这两位变出来)
②当前为A,前者为B(BA)
dp[st][0]=dp[st-1][0] (BA都不发生变化)
dp[st][1]=dp[st-2][0]+dp[st-2][1] (BA由AB转化来,递归到前面两位)
③当前与前者相同(AA或者BB)
dp[st][0]=dp[st-1][0]+dp[st-1][1]
dp[st][1]=0
#采用动态规划加递归求解
#状态转移方程:
'''①当前为B,前者为A(AB)dp[st][0]=dp[st-1][1]dp[st][1]=0②当前为A,前者为B(BA)dp[st][0]=dp[st-1][0]dp[st][1]=dp[st-2][0]+dp[st-2][1]③当前与前者相同(AA或者BB)dp[st][0]=dp[st-1][0]+dp[st-1][1]dp[st][1]=0'''s=input()
dp=[[0 for i in range(2)] for j in range(105)]
num=len(s)def change(start,end):global dpglobal sglobal numdp[start][0] = 1;dp[start][1] = 0;while start != end:start = (start + 1) % num;#当前为B,前者为Aif s[start]=='B' and s[(start - 1 + num) % num]=='A':dp[start][0] = dp[(start - 1 + num) % num][1]dp[start][1] = 0#当前为A,前者为Belif s[start]=='A' and s[(start - 1 + num) % num]=='B':dp[start][0] = dp[(start - 1 + num) % num][0]dp[start][1] = dp[(start - 2 + num) % num][0] + dp[(start - 2 + num) % num][1]if dp[start][1] == 0:dp[start][1] = 1#当前与前者相同else:dp[start][0] = dp[(start - 1 + num) % num][0] + dp[(start - 1 + num) % num][1]dp[start][1] = 0return dp[start][0] + dp[start][1]def unchange(start,end):t = 2if s[start] == 'B':if s[(start + 1) % num] == 'A':start = (start + 2) % numt += 2else:return 0if s[end] == 'A':if s[(end - 1 + num) % num] == 'B':end = (end - 2 + num) % numt += 2;else:return 0if t >= num:return 1global dpdp[start][0] = 1dp[start][1] = 0while start != end:start = (start + 1) % num;#当前为B,前者为Aif s[start]=='B' and s[(start - 1 + num) % num]=='A':dp[start][0] = dp[(start - 1 + num) % num][1]dp[start][1] = 0;#当前为A,前者为Belif s[start]=='A' and s[(start - 1 + num) % num]=='B':dp[start][0] = dp[(start - 1 + num) % num][0]dp[start][1] = dp[(start - 2 + num) % num][0] + dp[(start - 2 + num) % num][1]if dp[start][1] == 0:dp[start][1] = 1#当前与前者相同else:dp[start][0] = dp[(start - 1 + num) % num][0] + dp[(start - 1 + num) % num][1]dp[start][1] = 0return dp[start][0] + dp[start][1];case_num = 0;
start = 0;
for i in range(num):if s[i]=='B' and s[i+1]=='A':start = ibreakcase_num = change((start + 2) % num,(start - 1 + num) % num) + unchange((start + 2) % num,(start - 1 + num) % num);
print(case_num)

蓝桥杯算法训练cowboys-dp-递归-python题解相关推荐

  1. 蓝桥杯 算法训练 Cowboys DP

    算法训练 Cowboys 时间限制:2.0s   内存限制:256.0MB 问题描述 一个间不容发的时刻:n个牛仔站立于一个环中,并且每个牛仔都用左轮手枪指着他旁边的人!每个牛仔指着他顺时针或者逆时针 ...

  2. 蓝桥杯算法训练-24点(Python)

    问题描述 24点游戏是一个非常有意思的游戏,很流行,玩法很简单:给你4张牌,每张牌上有数字(其中A代表1,J代表11,Q代表12,K代表13),你可以利用数学中的加.减.乘.除以及括号想办法得到24, ...

  3. Java实现 蓝桥杯 算法训练 Cowboys

    试题 算法训练 Cowboys 问题描述 一个间不容发的时刻:n个牛仔站立于一个环中,并且每个牛仔都用左轮手枪指着他旁边的人!每个牛仔指着他顺时针或者逆时针方向上的相邻的人.正如很多西部片那样,在这一 ...

  4. 蓝桥杯 算法训练 Cowboys

    算法训练 Cowboys   时间限制:2.0s   内存限制:256.0MB      问题描述 一个间不容发的时刻:n个牛仔站立于一个环中,并且每个牛仔都用左轮手枪指着他旁边的人!每个牛仔指着他顺 ...

  5. 蓝桥杯 算法训练 Cowboys By Assassin dp+字符串操作

    问题描述一个间不容发的时刻:n个牛仔站立于一个环中,并且每个牛仔都用左轮手枪指着他旁边的人!每个牛仔指着他顺时针或者逆时针方向上的相邻的人.正如很多西部片那样,在这一刻,绳命是入刺的不可惜--对峙的场 ...

  6. java 蓝桥杯算法训练 瓷砖铺放(题解)

    试题 算法训练 瓷砖铺放 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限 ...

  7. java 蓝桥杯算法训练 每月的天数(题解)

    试题 算法训练 每月的天数 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 编写程序,输入月份,输出该月包含的天数,例如1月有31天(设定年份为2015年) 输入格式 一个整数:月份 ...

  8. java 蓝桥杯算法训练 猴子分苹果(题解)

    试题 算法训练 猴子分苹果 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分.这些猴子很崇拜猴王孙悟空,所以都想给他留一些 ...

  9. java 蓝桥杯算法训练 求完数(题解)

    试题 算法训练 8-2求完数 资源限制 时间限制:50.0s 内存限制:256.0MB 问题描述 如果一个自然数的所有小于自身的因子之和等于该数,则称为完数.设计算法,打印1-9999之间的所有完数. ...

  10. java 蓝桥杯算法训练 寂寞的数(题解)

    试题 算法训练 寂寞的数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 道德经曰:一生二,二生三,三生万物. 对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和. ...

最新文章

  1. mysql第三章关系模型_一个MySQL关系模型只有三个关系(二维表)组成。_学小易找答案...
  2. 学计算机应用好还是汽车维修好,大学汽车运用与维修专业怎么样_学什么_前景好吗-520吉他网...
  3. lstm timestep一般是多少_用LSTM中的不同时间步长预测使用keras
  4. 测试Robotium
  5. php api数据,php API查询数据
  6. tcp/ip 协议栈Linux源码分析五 IPv6分片报文重组分析一
  7. MFC 窗体样式修改
  8. php判断数组下标,php判断json或者数组格式与给定格式是否一致
  9. [机器学习-实践篇]贝叶斯算法
  10. LeetCode 914. 卡牌分组
  11. android 广告close,小程序广告弹出与关闭
  12. anaconda安装numpy_Python3.8如何安装Numpy
  13. Hyperledger Fabric教程(14)--byfn.sh所有命令
  14. xftp传输文件报错
  15. python好友信息管理系统
  16. 杭电oj部分新手入门题目全解(1089-1096)
  17. 网易云视频直播推流集成大致过程
  18. 计算机应用基础精品课程申报表,“大学计算机基础”校级精品课程组积极申报2020年山西省精品共享课程...
  19. 斐讯k2修改dns服务器,斐讯k2路由器怎么重置?_斐讯k2恢复出厂设置教程-192路由网...
  20. python图像光谱视觉分析库-imgvision

热门文章

  1. 彩虹对接牛蛙WK插件,无授权
  2. Java Web应用开发实用教程,JavaWeb应用开发实用教程习题部分汇总
  3. 如何在mysql官网下载mysql最新或者以前的版本
  4. 服务器上建个新文件夹怎么共享打印机,新服务器怎样设置共享打印机
  5. MAC笔记本安装python3遇到的坑和解法
  6. php编写跑马灯,使用C++的编程风格写一个跑马灯的例程
  7. 推荐一个下载神器(官网资料下载必备)
  8. 6,xilinx 7系列FPGA理论篇——时钟操作法则
  9. 透过汽车之家二手车业务,看二手车市场的模式终局
  10. 中国网文出海先行者阅文集团四度入选国家文化出口重点企业名单