【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 种动画各有优劣,实际应用中根据掌握情况作出取舍,本文讨论 ...
随机推荐
- 使用showmap分析android进程内存占用情况(转载)
转自:http://my.oschina.net/shaorongjie/blog/105354 可以使用adb shell showmap pid查看一个进程的showmap,这对于我们来说非常有用 ...
- Python网咯爬虫 — Scrapy框架应用
Scrapy框架 Scrapy是一个高级的爬虫框架,它不仅包括了爬虫的特征,还可以方便地将爬虫数据保存到CSV.Json等文件中. Scrapy用途广泛,可以用于数据挖掘.监测 ...
- 无线网络发射选址 2014年NOIP全国联赛提高组(二维前缀和)
P2038 无线网络发射器选址 题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南 ...
- [转]深入C语言内存区域分配(进程的各个段)详解
一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)在存储(没有调入到内存运行)时拥有3个部分,分别是代码段(text).数据段(data ...
- [Offer收割]编程练习赛84 -- 括号序列
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个只包含'(', ')'和''的字符串S,现在小Hi可以任意指定''为'('或')',不同的'*'可以是不同的字符. ...
- PHP 操作数据库乱码 以及调试
mysql> show create database pxscj;+----------+--------------------------------------------------- ...
- 小白的python之路 序
计算机专科毕业,.net开发已有8年有余,中途断断续续,似懂非懂,积累了一些经验知识,但是不求甚解,属于那种一瓶不满半瓶子晃荡,这么一个状态. 主要从事web开发,涉及一些前端jq等,还有接口开发,搜 ...
- java excel poi导入 过滤空行的方法 判断是否是空行
private boolean isRowEmpty(Row row){ for (int c = row.getFirstCellNum(); c < row.getLastCellNum() ...
- PHP安装yaf在ubuntu下面的问题解决
1.在执行make的时候出现如下错误: In file included from /root/yaf-2.1.2/yaf_router.c:28: /usr/include/php/ext/pcre ...
- 一个用pyton写的监控服务端进程的软件hcm
使用udp实现,简单,方便,不用三次握手 1. 所有部署服务器进程的机器有一个代理进程hagent,用来监听hcm console中发送过来的命令 2.hcm需要提供以下命令 start :普通方式启 ...