算法训练 Cowboys(DP)
测试样例二中,可能的初始排列为:"AABBB"和"BABBA"。
#include<bits/stdc++.h>
using namespace std;
long long dp[][]={};
int main(){
dp[][]=;
dp[][]=;
dp[][]=;
dp[][]=;
for(int i=;i<=;i++){ //打表dp情况数
dp[i][]=dp[i-][];
dp[i][]=dp[i-][];
dp[i][]=dp[i-][]+dp[i-][];
dp[i][]=dp[i-][];
}
string target;
int length,i;
while(cin>>target){
length=target.size();
string tmp1="",tmp2=""; //检查是否存在全A或者全B情况
for(int k=;i<length;k++){
tmp1+="A";
tmp2+="B";
}
if(target==tmp1||target==tmp2){
cout<<<<endl;
return ;
}
if(length%==){
tmp1="";
tmp2="";
for(int i=;i<=length/;i++){ //检查是否全串都是一个BA串!
tmp1+="AB";
tmp2+="BA";
}
if(tmp1==target||tmp2==target){
cout<<dp[length/-][]+dp[length/-][]<<endl;
return ;
}
}
for(i=;i<length;i++){ //找到第一组BA开始位置
if(target[i]=='B'&&target[(i+)%length]=='A'){
break;
}
} for(int j=i;;j=(j+)%length){ //找到第一组BA结束位置
if(target[j]!='B'||target[(j+)%length]!='A'){
i=j;
break;
}
}
int times=,start,end;
long long ans=;
for(int j=i;j<i+length;j++){
if(target[j%length]=='B'&&target[(j+)%length]=='A'){
if(times==){
start=(j+length-)%length; //记录开始位置,记得-1
}
times++;
j++; //循环中有++那么这里再++就够了
}
else {
if(times!=){ //如果已经记录了BA组数
end=j%length; //记录结束位置
if(target[start]=='A'&&target[end]=='A') ans*=dp[times][];
else if(target[start]=='A'&&target[end]=='B') ans*=dp[times][];
else if(target[start]=='B'&&target[end]=='A') ans*=dp[times][];
else if(target[start]=='B'&&target[end]=='B') ans*=dp[times][];
times=; //一个串记录的组数清零
}
}
}
if(times!=){ //别忘了最后一组!看我实现构造的方法,最后一组是被忽略掉的
end=i%length;
if(target[start]=='A'&&target[end]=='A') ans*=dp[times][];
else if(target[start]=='A'&&target[end]=='B') ans*=dp[times][];
else if(target[start]=='B'&&target[end]=='A') ans*=dp[times][];
else if(target[start]=='B'&&target[end]=='B') ans*=dp[times][];
} cout<<ans<<endl;
}
return ;
}
没看懂系列(((((
算法训练 Cowboys(DP)的更多相关文章
- Java实现 蓝桥杯 算法训练 Cowboys
试题 算法训练 Cowboys 问题描述 一个间不容发的时刻:n个牛仔站立于一个环中,并且每个牛仔都用左轮手枪指着他旁边的人!每个牛仔指着他顺时针或者逆时针方向上的相邻的人.正如很多西部片那样,在这一 ...
- 算法训练 最大的算式 DP
算法训练 最大的算式 时间限制:1.0s 内存限制:256.0MB 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果 ...
- 算法训练 K好数
算法训练 K好数 时间限制:1.0s 内存限制:256.0MB 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数 ...
- 算法训练 K好数 解析
算法训练 K好数 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K ...
- 蓝桥杯 算法训练 ALGO-116 最大的算式
算法训练 最大的算式 时间限制:1.0s 内存限制:256.0MB 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量 ...
- 算法训练 K好数(C/C++)AC码
蓝桥杯 算法训练 K好数 AC码 题目要求: 算法训练 K好数 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如 ...
- 蓝桥杯 算法训练 ALGO-36 传纸条
算法训练 传纸条 时间限制:1.0s 内存限制:512.0MB 问题描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而 ...
- 蓝桥杯 算法训练 ALGO-21 装箱问题
算法训练 装箱问题 时间限制:1.0s 内存限制:256.0MB 问题描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每 ...
- [算法模版]子序列DP
[算法模版]子序列DP 如何求本质不同子序列个数? 朴素DP 复杂度为\(O(nq)\).其中\(q\)为字符集大小. \(dp[i]\)代表以第\(i\)个数结尾的本质不同子序列个数.注意,这里对于 ...
随机推荐
- HTTP-Runoob:HTPP Content-Type
ylbtech-HTTP-Runoob:HTPP Content-Type 1.返回顶部 1. HTTP content-type Content-Type,内容类型,一般是指网页中存在的Conten ...
- 杂项:C# 方法、属性杂项-01
ylbtech-杂项:C# 方法.属性杂项-01 1. 属性杂项返回顶部 1. public int ReadCnt { get; set; } 2.设置默认值 public int ReadCnt ...
- css水平居中(一)
第一种方法:使用text-align属性. 看到一篇博客,也不知道是不是我理解的问题,博客上说text-align可以是内联元素水平居中,我感觉这样的说法是不是有些不准确. text-align属性规 ...
- VI中的多行删除与复制(转)
VI中的多行删除与复制 法一: 单行删除,:(待删除行)d 多行删除 ,:,10d 法二: 光标所在行,dd 光标所在行以下的N行,Ndd 方法1: 光标放到第6行, 输入:2yy 光标放到第9行, ...
- springmvc 处理器方法返回的是string 重定向到处理器方法
- PHP如何将XML转成数组
如果你使用 curl 获取的 xml data $xml = simplexml_load_string($data); $data['tk'] = json_decode(json_encode($ ...
- eclipse格式化代码模板
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <profi ...
- Angular07 利用angular打造管理系统页面
1 创建一个新的angular应用 ng new adminSystem 2 利用WebStorm打开adminSystem应用 3 借助AdminLTE这个开源项目来辅助开发 AdminLTE项目: ...
- php学习笔记-POST和GET的区别
POST和GET都可以用来提交数据. POST方法提交的数据在浏览器的地址栏是不可见的,当然利用一些工具是可以看到的,而GET方法提交的数据在地址栏是可见的.两者比较,POST更安全一点. POST方 ...
- python3-打印一个进度条
# Auther: Aaron Fan import sys,time for i in range(30): #打印一个#号,这种方法打印不会自动换行 sys.stdout.write('#') # ...