【Lqb T336】Cowboys
【链接】 我是链接,点我呀:)
【题意】
出现AB就要交换一下
给你结果序列
问你原序列有多少种可能
首尾可以交换.
【题解】
设
dp[i][0]表示i和i-1不交换,达到前i个字符序列的状态的方案数
dp[i][1]表示i和i-1交换,达到前i个字符序列的状态的方案数
对于
s[i-1] s[i]
A B
B A
A A
B B
这四种情况分类讨论一下就好.
只要记着如果遇到了AB一定要交换就好
然后就不难想到转移方法
(转移方法在代码里看就好)
然后上面这种是首尾不交换的方案.
还需要考虑一种就是首尾可以交换的方案数.
这个时候,只需要把首部和尾部强行交换一下就好
然后在中间的n-2个数字再做一下相同的DP就好
方案数累加两次
【代码】
import java.io.*;
import java.util.*;
public class Main {
static InputReader in;
static PrintWriter out;
public static void main(String[] args) throws IOException{
//InputStream ins = new FileInputStream("E:\\rush.txt");
InputStream ins = System.in;
in = new InputReader(ins);
out = new PrintWriter(System.out);
//code start from here
new Task().solve(in, out);
out.close();
}
static int N = 1000;
static class Task{
String s;
int n;
int dp[][];
public void solve(InputReader in,PrintWriter out) {
dp = new int[N+10][2];
s = in.next();
n = s.length();
dp[0][0] = 1;
dp[1][0] = 1;
for (int ii = 1;ii < n;ii++){
int i = ii+1;
if (s.charAt(ii-1)=='A' && s.charAt(ii)=='B') {
dp[i][0] = dp[i-1][1];
dp[i][1] = 0;
}
if (s.charAt(ii-1)=='B' && s.charAt(ii)=='A') {
dp[i][0] = dp[i-1][0] + dp[i-1][1];
dp[i][1] = dp[i-2][0] + dp[i-2][1];
}
if (s.charAt(ii-1)==s.charAt(ii)) {
dp[i][1] = 0;
dp[i][0] = dp[i-1][0]+dp[i-1][1];
}
}
int ans = 0;
ans = dp[n][0]+dp[n][1];
if (s.charAt(n-1)=='B' && s.charAt(0)=='A') {
StringBuilder sb = new StringBuilder(s);
sb.setCharAt(n-1, 'A');
sb.setCharAt(0, 'B');
for (int i = 0;i <= n;i++)
for (int j = 0;j < 2;j++)
dp[i][j] = 0;
dp[1][1] = 1;
for (int ii = 1;ii <n-1;ii++) {
int i = ii+1;
if (s.charAt(ii-1)=='A' && s.charAt(ii)=='B') {
dp[i][0] = dp[i-1][1];
dp[i][1] = 0;
}
if (s.charAt(ii-1)=='B' && s.charAt(ii)=='A') {
dp[i][0] = dp[i-1][0] + dp[i-1][1];
dp[i][1] = dp[i-2][0] + dp[i-2][1];
}
if (s.charAt(ii-1)==s.charAt(ii)) {
dp[i][1] = 0;
dp[i][0] = dp[i-1][0]+dp[i-1][1];
}
}
ans = ans + dp[n-1][0] + dp[n-1][1];
}
out.println(ans);
}
}
static class InputReader{
public BufferedReader br;
public StringTokenizer tokenizer;
public InputReader(InputStream ins) {
br = new BufferedReader(new InputStreamReader(ins));
tokenizer = null;
}
public String next(){
while (tokenizer==null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(br.readLine());
}catch(IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
}
}
【Lqb T336】Cowboys的更多相关文章
- 【AR实验室】mulberryAR : ORBSLAM2+VVSION
本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 mulberryAR是我业余时间弄的一个AR引擎,目前主要支持单目视觉SLAM+3D渲染,并且支持iOS端,但是该引 ...
- 【.net 深呼吸】细说CodeDom(1):结构大观
CodeDom 是啥东东?Html Dom听过吧,XML Dom听过吧.DOM一般可翻译为 文档对象模型,那 Code + DOM呢,自然是指代码文档模型了.如果你从来没接触过 CodeDom,你大概 ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- 【前端性能】高性能滚动 scroll 及页面渲染优化
最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作. 本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的 ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 【.net 深呼吸】程序集的热更新
当一个程序集被加载使用的时候,出于数据的完整性和安全性考虑,程序集文件(在99.9998%的情况下是.dll文件)会被锁定,如果此时你想更新程序集(实际上是替换dll文件),是不可以操作的,这时你得把 ...
- 【.net 深呼吸】跨应用程序域执行程序集
应用程序域,你在网上可以查到它的定义,凡是概念性的东西,大伙儿只需要会搜索就行,内容看了就罢,不用去记忆,更不用去背,“名词解释”是大学考试里面最无聊最没水平的题型. 简单地说,应用程序域让你可以在一 ...
- 【Web动画】SVG 实现复杂线条动画
在上一篇文章中,我们初步实现了一些利用基本图形就能完成的线条动画: [Web动画]SVG 线条动画入门 当然,事物都是朝着熵增焓减的方向发展的,复杂线条也肯定比有序线条要多. 很多时候,我们无法人工去 ...
- 【Web动画】SVG 线条动画入门
通常我们说的 Web 动画,包含了三大类. CSS3 动画 javascript 动画(canvas) html 动画(SVG) 个人认为 3 种动画各有优劣,实际应用中根据掌握情况作出取舍,本文讨论 ...
随机推荐
- MySQL 循环分支语法
---恢复内容开始--- Loop循环 label: LOOP statement_list IF exit_condition THEN LEAVE label; END IF; END LOOP ...
- 汇编程序49:实验14 访问CMOS RAM(显示系统时间)
assume cs:code ;安装程序,使用指令out和in指令 code segment start: mov ax,cs mov ds,ax mov si,offset sub1 mov ax, ...
- [Qt Quick入门] 基本元素初体验
Qt Quick作为QML语言的标准库,提供了很多基本元素和控件来帮助我们构建Qt Quick应用.这节我们简要地介绍一些Qt Quick元素,如Rectangle.Item.Text.Button. ...
- 构造 Codeforces Round #275 (Div. 2) C. Diverse Permutation
题目传送门 /* 构造:首先先选好k个不同的值,从1到k,按要求把数字放好,其余的随便放.因为是绝对差值,从n开始一下一上, 这样保证不会超出边界并且以防其余的数相邻绝对值差>k */ /*** ...
- Linux环境下修改MySQL数据库存储引擎
今天在执行Oracle数据库迁移至MySQL数据库时报出了一个错误信息: Specified key was too bytes 百度发现,原来需要更改MySQL数据库的存储引擎为InnoDB,查询目 ...
- .net 反射初体验
一.获取对象中的所有属性 Type是.net定义的一个反射的类.通过反射获取到对象的所有属性,然后根据属性获取对象对应属性所对应的值. 使用PropertyInfo,请引用命名空间using Syst ...
- Java开发笔记(九十二)文件通道的基本用法
前面介绍的各色流式IO在功能方面着实强大,处理文件的时候该具备的操作应有尽有,可流式IO在性能方面不尽如人意,它的设计原理使得实际运行效率偏低,为此从Java4开始增加了NIO技术,通过全新的架构体系 ...
- 6.13---shiro
- 创建maven项目遇到的问题
1.新建完成的maven项目,缺少src/main/java 解决方案:把项目中的jre换成eclipse中默认的jre. 另外还可以参考:解决Eclipse建立Maven项目后无法建立src/mai ...
- Mantis 配置与使用学习
转载自:http://blog.csdn.net/xifeijian/article/category/1429687