【dp】CF17C. Balance

http://codeforces.com/problemset/problem/17/C

    题目中给出一个仅含有a,b,c的字符串,已经两种操作每次选出任意两个相邻的字符,用第一个覆盖掉第二个或者反之,最后询问不考虑操作次数,最终有多少种不同的序列其中a,b,c三种字符两两间相差不超过1个。

      很有趣的动态规划,一开始一直在考虑边构造目标串边dp,考虑前i个含有多少a,b,c之类都找不到可以在时限内通过的办法,后来重新审题发现可以重定义其两种操作,可以这样等价的描述原串通过这两种操作可以到达的目标串,将目标串相邻的重复元素去掉,剩下的元素所组成的序列,一定是原串的子序列!重定义之后很容易想到一种新的状态表示方式,dp[i][a][b][c],当前目标串含有3个字符分别a,b,c个,同时匹配到原串的第i位,的方案数,转移只要简单枚举一下下一个字符就行。详见代码

View Code
 1 //By Lin
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define MOD 51123987 
 6 using namespace std; 
 7 
 8 int        n;
 9 int        dp[155][52][52][52];
10 int        nxt[155][3];
11 char    str[155];
12 
13 int        next(int i,int k){
14     for (; i<n; i++) if ( str[i]-'a' == k ) return i;
15     return -1;
16 }
17 inline    void add(int &x,int y ){
18     x += y;
19     if ( x>=MOD ) x-=MOD;
20 }
21 int        main(){
22     scanf("%d%s", &n, str );
23     for (int i = 0; i<n; i++) 
24         for(int k = 0; k<3; k++ ) 
25             nxt[i][k] = next(i,k);
26     int lim = (n+2)/3;
27     dp[0][0][0][0] = 1;
28     int ans = 0; 
29     for (int i = 0; i<n; i++)
30         for (int a1 = 0; a1<=lim; a1++)
31             for (int a2 = 0; a2<=lim; a2++)
32                 for (int a3 = 0; a3<=lim; a3++){
33                     if ( dp[i][a1][a2][a3] == 0 ) continue;
34                     if ( a1+a2+a3 == n ) {
35                         if ( abs(a1-a2)<=1 && abs(a1-a3)<=1 && abs(a2-a3)<=1 ){
36                             add(ans,dp[i][a1][a2][a3]);
37                         }
38                         break;
39                     }
40                     if ( nxt[i][0] != -1 )
41                         add(dp[nxt[i][0]][a1+1][a2][a3] , dp[i][a1][a2][a3]);
42                     if ( nxt[i][1] != -1 )
43                         add(dp[nxt[i][1]][a1][a2+1][a3] , dp[i][a1][a2][a3]);
44                     if ( nxt[i][2] != -1 )
45                         add(dp[nxt[i][2]][a1][a2][a3+1] , dp[i][a1][a2][a3]);
46                 }
47     printf("%d\n", ans );
48     return 0;
49 }

 

转载于:https://www.cnblogs.com/lzqxh/archive/2012/12/07/2807405.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ECSHOP设置默认配送方式和默认支付方式

用过ECSHOP的站长都知道&#xff0c;首次登陆ECSHOP进行购物的时候&#xff0c;购物流程中没有“默认配送方式和默认支付方式”这个功能 即使网站上只有一种配送方式&#xff0c;它也不会默认选中这个唯一的配送方式。 当你的网站只有一种配送方式&#xff0c;或者&#xff0c;…

spring如何解决循环依赖

什么是循环依赖&#xff1f; 循环依赖其实是指两个及以上bean相互持有对方&#xff0c;最终形成闭环的过程&#xff08;一般聊循环依赖都是默认的单例bean&#xff09;&#xff0c;简单说就是A依赖B,B依赖C,C又依赖A。 下面我就借用别人的网图来解释下&#xff1a; 注意&#…

利用Frame Animation实现动画效果,代码正确,就是达不到变换效果

就是因为把第一帧图片设置成了ImageView的src资源&#xff0c;从而一直覆盖在变换效果之上&#xff0c;去掉ImageView的src属性即可解决。 要想使应用已载入便播放动画效果&#xff0c;直接将 animationDrawables.start(); 放在activity的各种回调函数中&#xff08;onCreate、…

【电信增值业务学习笔记】3 语音类增值业务

作者&#xff1a;gnuhpc 出处&#xff1a;http://www.cnblogs.com/gnuhpc/ 1.一卡多号&#xff1a;&#xff08;Single SIM Multiple Number -SSMN&#xff09; 为拥有一个SIM卡的移动用户提供多个电话号码作为副号码主叫&#xff1a;可以选择用主号码还是副号码发起呼叫被叫&a…

循环依赖源码深度解析

singletonObjects &#xff08;一级缓存&#xff09;它是我们最熟悉的朋友&#xff0c;俗称“单例池”“容器”&#xff0c;缓存创建完成单例Bean的地方。 earlySingletonObjects&#xff08;二级缓存&#xff09;映射Bean的早期引用&#xff0c;也就是说在这个Map里的Bean不是…

多线程间共享变量线程安全问题——ThreadLocal

Java并发编程中很重要的类&#xff1a;ThreadLocal 在多线程应用程序中&#xff0c;对共享变量进行读写的场景是很常见的。如果不使用一定的技术或方案&#xff0c;会引发各种线程安全的问题。常见解决线程安全的方式有synchronized、volatile等方式&#xff0c;但synchronized…

java8流式操作

简介&#xff1a;Stream 中文称为 “流”&#xff0c;通过将集合转换为这么一种叫做 “流” 的元素序列&#xff0c;通过声明性方式&#xff0c;能够对集合中的每个元素进行一系列并行或串行的流水线操作。 操作分类&#xff1a; .stream() stream()把一个源数据&#xff0c;可…

ArrayList源码阅读

private static void extracted() {ArrayList<StudentVO> arrayList new ArrayList<StudentVO>();arrayList.add(new StudentVO("张三", 23));arrayList.add(new StudentVO("李四", 24));arrayList.add(new StudentVO("王五", 24))…

常用的JS小功能整理

<a href"#" onclick "this.style.behaviorurl(#default#homepage);this.sethomepage(http://www.mingrisoft.com)" style" color:Black; font-size: 9pt; font-family: 宋体; text-decoration :none;" >设置主页</a> <a href&quo…

类的加载过程

类的加载过程 代码 public class Father{private int i test();private static int j method();static{System.out.print("(1)");}Father(){System.out.print("(2)");}{System.out.print("(3)");)public int test(){System.out.print("(…

教你如何开发一个 SpringBoot starter

从前从前&#xff0c;有个面试官问我一个 SpringBoot Starter 的开发流程&#xff0c;我说我没有写过 starter&#xff0c;然后就没有然后了&#xff0c;面试官说我技术深度不够。 我想说这东西不是很简单吗&#xff0c;如果要自己写一个出来也是分分钟的事情。至于就因为我没…

两分钟彻底让你明白Android Activity生命周期(图文)!

转&#xff1a;http://blog.csdn.net/qyf_5445/article/details/8290232 首先看一下Android api中所提供的Activity生命周期图(不明白的&#xff0c;可以看完整篇文章&#xff0c;在回头看一下这个图&#xff0c;你会明白的): Activity其实是继承了ApplicationContext这个类&am…

spring4和spring5的aop执行顺序区别?

spring4单切面 spring4多切面 spring4 spring5

jquery datepicker 点击日期控件不会自动更新input的值

页面代码&#xff1a;<link href"http://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css" rel"stylesheet" type"text/css"/> <link href"/static/css/main.css" rel"stylesheet" type"text/css"/…

一个b+树库存放多少索引记录

MySQL中InnoDB页的大小默认是16k。也可以自己进行设置。&#xff08;计算机在存储数据的时候&#xff0c;最小存储单元是扇区&#xff0c;一个扇区的大小是 512 字节&#xff0c;而文件系统&#xff08;例如 XFS/EXT4&#xff09;最小单元是块&#xff0c;一个块的大小是 4KB。…

检索函数retrieve

转载于:https://www.cnblogs.com/flowjacky/archive/2012/12/28/2836729.html

BootCDN——React入门学习

首先下载:react依赖&#xff1a;react.js、react-dom.js、babel.js 这种方式容易出错&#xff0c;所以不使用这个 使用下面方式正真的用法;Babel 中文网 Babel - 下一代 JavaScript 语法的编译器

redis事务命令复习

命令复习&#xff1a; multi&#xff1a;开启事务 开启事务之后&#xff0c;讲要操作的命令都放到了QUEUED&#xff08;queued&#xff09;队列里&#xff0c;然后通过EXEC命令一起提交。 对于WATCH命令&#xff1a; 开启了事务&#xff0c;没有提交&#xff0c;这时候又有一…

STM32示波器 信号发生器

关于stm32的示波器&#xff0c;网上以经有很多了。这里还是想把自己的设计思想发表出来。这个项目已经准备了很久。这里首先要感谢以前的团队&#xff0c;非常感觉陈师和覃总两位经验丰富的嵌入式工程师&#xff0c;获得了不少多方面的考虑。如果不是工作调整等原因&#xff0c…