算法训练 Cowboys  

                                    时间限制:2.0s   内存限制:256.0MB

问题描述
一个间不容发的时刻: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"。
P.s:
“A”表示顺时针方向,“B”表示逆时针方向。当一对相邻的牛仔发现他们正在互指的时候,就会转过身。说明将‘BA’转化为‘AB’;
然而 牛仔环“ABBBABBBA”在一秒后会变成“BABBBABBA”;而牛仔环“BABBA”会变成“ABABB” 说明是将‘AB’转化为‘BA’;
以给的例子为准。(样例似乎两者都可)
思路: 动态规划   
dp[i][0] 表示第 i 个数不与前者交换得到,dp[i][1]表示第i个数与前者交换得到
如果当前数与前者相等,则采用 dp[i][0] = dp[i-1][0] + dp[i-1][1];
如果当前数为A,前者为B ,则 ‘AB’ 不可能是‘BA’变化得到,且前一个数必定经过了交换,dp[i][0] = dp[i-1][1]; dp[i][1] = 0; 
如果当前数为B,前者为A ,则 ‘BA’     可能是‘AB’变化得到,dp[i][0] = dp[i-1][0] + dp[i-1][1]; dp[i][1] = dp[i-2][0] + dp[i-2][1]; 
如果都是 A 或B 直接输出 1;
否则一定可以找到一个 BA ,先不管当前BA的可能取值,设该‘B’ 的位置为cot,取st = cot+2,ed = cot - 1,初始化dp[st][1] = 0,
dp[st][0]=1; 从st运算到ed ,st++;
取 sum = dp[st][0] + dp[st][1];
 如果 BA 之前是 AA,则一定要变为 AAAB,如果BA之后是BB,则一定要变为 ABBB,答案即为sum;
 如果 BA 之前是 B 且 BA 之后 是 A,则 BA 可变可不变;
 如果 BA 之前是 BA 或者 BA 之后 是 BA,则 st+=2 或 ed -=2,即 BABA 可能由 ABBA 或者 BAAB得到,这时候还要考虑 s 为 BABA 与 BABABA 的情况。
#include <iostream>
#include<string.h>
#include<cstdio>
using namespace std;
#define N 105
int dp[N][2];
string s;
int main()
{cin>>s;bool flag = 0;int len = s.length();for(int i=1;i<len;i++){if(s[i]!=s[0]){flag = 1;break;}}if(!flag){                     //如果都为 ‘A’或 ‘B’cout<<1; return 0;}int cot;for(int i=0;i<len;i++){        //找到 ‘BA’if(s[ (i+1) %len] == s[i] - 1){cot = i; break;}}int st = (cot + 2) % len;int ed = (cot - 1 + len) % len;dp[st][0] = 1;dp[st][1] = 0;while(st != ed){st = (st+1) % len;if(s[st]==s[(st-1+len) %len]){dp[st][0] = dp[ (st-1+len) %len][0] + dp[(st-1+len) %len][1];dp[st][1] = 0;}else if(s[st] == s[(st-1+len) %len] + 1){dp[st][0] = dp[(st-1+len) %len][1];dp[st][1] = 0;}else{dp[st][0] = dp[(st-1+len) %len][0] + dp[(st-1+len) %len][1];dp[st][1] = dp[(st-2+len) %len][0] + dp[(st-2+len) %len][1];if(dp[st][1] == 0) dp[st][1] = 1;}}int sum = dp[st][0] + dp[st][1];if(s[(cot + 2) % len]=='B' && s[(cot + 3) % len]=='B'){cout<<sum; return 0;                 //如果是 BABB}if(s[(cot - 1 + len) % len]=='A' && s[(cot -2 + len) % len]=='A'){cout<<sum; return 0;                 // 如果是 AABA}int length = 2;st = (cot + 2) % len;ed = (cot - 1 + len) % len;if(s[(cot + 2) % len]=='B' && s[(cot + 3) % len]=='A'){st = (st + 2) % len;length +=2;}if(s[(cot - 1 + len) % len]=='A' && s[(cot -2 + len) % len]=='B'){ed =(ed - 2 + len) % len;length+=2;}if(length>=len){              //如果 是 BABA 或者 BABABAcout<<sum+1; return 0;}memset(dp,0,sizeof(dp));      //注意清空dp[st][0] = 1;dp[st][1] = 0;while(st != ed){st = (st+1) % len;if(s[st]==s[(st-1+len) %len]){dp[st][0] = dp[ (st-1+len) %len][0] + dp[(st-1+len) %len][1];dp[st][1] = 0;}else if(s[st] == s[(st-1+len) %len] + 1){dp[st][0] = dp[(st-1+len) %len][1];dp[st][1] = 0;}else{dp[st][0] = dp[(st-1+len) %len][0] + dp[(st-1+len) %len][1];dp[st][1] = dp[(st-2+len) %len][0] + dp[(st-2+len) %len][1];if(dp[st][1] == 0) dp[st][1] = 1;}}sum += dp[st][0] + dp[st][1];cout<<sum;return 0;
}

蓝桥杯-算法提高-Cowboys相关推荐

  1. [蓝桥杯][算法提高VIP]夺宝奇兵-递推+记忆化搜索

    题目描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 " ...

  2. [蓝桥杯][算法提高VIP]夺宝奇兵-dp

    题目描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 " ...

  3. JAVA 蓝桥杯 算法提高 阮小二买彩票

    JAVA 蓝桥杯 算法提高 阮小二买彩票 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电 ...

  4. [蓝桥杯][算法提高VIP]阮小二买彩票

    [蓝桥杯][算法提高VIP]阮小二买彩票 题目描述 在同学们的帮助下,阮小二是变的越来越懒了, 连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否有变多.可是一段时间观察下 ...

  5. 【蓝桥杯算法提高VIP-开灯游戏(两种超易理懂解法:暴力/位操作(切换位))(纯正C语言代码)】

    蓝桥杯算法提高VIP-开灯游戏 题目描述 有9盏灯与9个开关,编号都是1~9. 每个开关能控制若干盏灯,按下一次会改变其控制的灯的状态(亮的变成不亮,不亮变成亮的). 具体如下: 第一个开关控制第二, ...

  6. [蓝桥杯][算法提高] 填充蛋糕

    [蓝桥杯][算法提高] 填充蛋糕 编程计算涂满高为2,半径为r的圆形蛋糕表面,需要多少表面积的奶油(只要涂上表面和侧面) 读入一个数r,输出需要奶油的表面积,结果保留一位小数 样例输入 5.0 样例输 ...

  7. c语言oj题1923偶数之和,问题 1923: [蓝桥杯][算法提高VIP]学霸的迷宫 (BFS)

    题目描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫.因为班长还有妹子要陪,磨刀不 ...

  8. JAVA 蓝桥杯 算法提高 色盲的民主

    JAVA 蓝桥杯 算法提高 色盲的民主 资源限制 时间限制:1.0s 内存限制:256.0MB  色盲的民主 问题描述 n个色盲聚在一起,讨论一块布的颜色.尽管都是色盲,却盲得各不相同.每个人都有自 ...

  9. [蓝桥杯][算法提高VIP]阮小二买彩票[递归全排列]

    题目 1578: [蓝桥杯][算法提高VIP]阮小二买彩票 时间限制: 1Sec 内存限制: 128MB 提交: 348 解决: 153 题目描述 在同学们的帮助下,阮小二是变的越来越懒了, 连算账都 ...

最新文章

  1. python编程难吗-Python、C+这些编程语言难吗?十岁女孩告诉你答案
  2. qt如何捕获应用程序输出_企业应用程序中需要捕获的5大Java性能指标
  3. python实时数据存储与显示_利用python进行数据加载和存储
  4. 机器学习笔记——支持向量机
  5. 【leetcode】1053. Previous Permutation With One Swap
  6. mysql注释符号_MySQL基础知识(2021最新版教程)
  7. Maven配置文件无法被导出或者生效的问题【已解决】
  8. 举世闻名的 SQL 注入是什么?这个漫画告诉你!
  9. 美团 Flink 大作业部署与状态稳定性优化实践
  10. linux内核源码下载地址
  11. jieba 使用笔记
  12. 第一章 复数与复变函数
  13. Qt各版本官方下载地址
  14. 地震后的重建!——AD灾难恢复!
  15. 如何对极乐迪斯科(Disco Elysium for mac)进行安装
  16. Torch中的benchmarkdeterministic是什么含义?
  17. spring中c3p0配置 ---这是一位仁兄的经历
  18. Java面试题总结-2022版
  19. UGUI源码分析:GridLayoutGroup网格布局组件与ContentSizeFitter尺寸调节组件
  20. idea重启端口占用问题

热门文章

  1. Remove Element
  2. ARM态度暧昧,愤怒的华为或投入Risc-V怀抱
  3. 关于显示器显示输入信号超出范围,请调整为1600x900@60hz解决办法
  4. 23 20210525+0529直播 企业微信接口测试实战1+2
  5. 中国芯片设计云技术白皮书2.0发布
  6. php x509certificate,ssl - .NET中的X509Certificate2和X509Certificate有什么区别?
  7. 传感器检测技术——传感器的静态特性
  8. 传统支付方式不能满足线下支付的需求
  9. 《Java Web开发实战》Java工程师推荐的进阶之路
  10. Android 之 Project Butter 详细介绍