【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,一经查实,立即删除!

相关文章

git常用的命令收集

1.强制推送&#xff08;慎用&#xff0c;除非你认为其他冲突等可以丢弃 或者不是很重要&#xff09;git push -- force git—全局设置用户名、密码、邮箱 git config命令的–global参数&#xff0c;用了这个参数&#xff0c;表示你这台机器上所有的Git仓库都会使用这个配置&…

git文件操作命令

1.创建文件等小命令 touch a // 创建一个a文件 echo 1234 >> a // 把1234这个内容放入a文件 cat a // 打开a文件 读取出a文件中的内容 mkdir test // 创建test文件夹 rm 文件名 // 删除文件 pwd // 打印当前工作路径2.安装git的时候 都会安装git bash和git GUI 我们完全也…

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不是…

java获取异常堆栈详情

/** * 获取exception详情信息 * * param e * Excetipn type * return String type */ public static String getExceptionDetail(Exception e) { StringBuffer msg new StringBuffer("null"); if (e ! null) { msg new StringBuffer(""); String messag…

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

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

我的学生时代之一[小学时代]

真是岁月如梭~ 猛然间这么一掐指&#xff0c;我都毕业4年有余了。先前工作一直不如意&#xff0c;到现在好一点点。 有时候一想&#xff0c;挺怀念上学的时光。 真的是回不去了~ 我又记得多少同学的名字&#xff1f;朋友还有多少常联系的&#xff1f;不很多~ 今天&#xff0c;突…

java8流式操作

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

web.config中httpRunTime的属性

配置httpRuntime也可以让FileUpload上传更大的文件,不过设置太大了会因用户将大量文件传递到该服务器而导致的拒绝服务攻击(属性有说明) <httpRuntime> <httpRuntime useFullyQualifiedRedirectUrl"true|false" maxRequestLength"size in kbytes"…

创建并运用客户化jsp标签

1.在WEB-INF目录下新建message.properties属性文件 文件内容为“key-value”对&#xff0c;添加测试内容如下&#xff1a;titlehello world bodyhello taglib 2.定义初始化类TaglibInit&#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("(…

微软企业库调用Oracle分页存储过程

存储过程&#xff1a;CREATE OR REPLACE PACKAGE pkg_tableTypeIS procedure FY( TableName varchar2, -- 表名getFields varchar2, -- 字段名(全部字段为*) OrderField varchar2, -- 排序字段(必须!支持多字段) whereCondition varchar2, -- 条件语句(不用加where) pageSize i…

Windows服务无法引用.dll的错误

项目中需要使用.NET开发Windows服务来检测MSMQ&#xff0c;但一直无法引用.dll(特别是.dll引用了其它的.dll)&#xff0c;最后google找到了答案&#xff1a; Every window service project, by default targets to .netClient version (which is not full version of .net and …

TC第一次成为room leader

虽然第二题竟然最后没通过system test&#xff0c;用递归的方法超时了 还好challenge 3个&#xff0c;以微弱优势胜过第二名 happy&#xff01; 继续努力转载于:https://www.cnblogs.com/fstang/archive/2012/12/21/2827345.html

[C/C++]BKDRHash

将字符串Hash成整型存储经常用到BKDRHash算法 uint64_t BKDRHash(const char *pszKey) {uint64_t seed 131;register uint64_t uCode0;while(pszKey[0]){uCode uCode *seed (unsigned char)pszKey[0];pszKey;}return uCode; }选择了64位的key&#xff0c;减少冲突的概率。转…