codeforces 17C Balance

题意

给定一个串,字符集{'a', 'b', 'c'},操作是:选定相邻的两个字符,把其中一个变成另一个。可以做0次或者多次,问最后可以生成多少种,使得任意一种字符和其他字符的个数相差都不超过1.

题解

一个生成串压缩之后必定都是初始串的子序列,那么只要能枚举所有子序列,其他的很好搞定。

对于枚举的每个子序列,如果它是由初始串最早能生成的产生,那么肯定不会重。

基于这一点,f(i, a, b, c)表示当前由初始串1~i生成子序列,三个字符分别的个数,类似背包转移即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for(int i=(a); i<(b); i++)
#define sz(a) (int)a.size()
#define de(a) cout << #a << " = " << a << endl
#define dd(a) cout << #a << " = " << a << " "
#define all(a) a.begin(), a.end()
#define endl "\n"
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
//--- const int N = 155, P = 51123987; int n, m;
int ne[N][3], f[N][55][55][55];
string s; void add(int &a, int b) {
if((a+=b)>=P) a-=P;
} int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
cin >> n >> s;
s = " " + s;
memset(ne, -1, sizeof(ne));
for(int i = sz(s)-1; ~i; --i) {
rep(j, 0, 3) ne[i][j] = ne[i+1][j];
if(i) ne[i][s[i]-'a'] = i;
}
m = (n+2)/3;
f[0][0][0][0] = 1;
rep(i, 0, n+1) {
rep(a, 0, m+1) rep(b, 0, m+1) rep(c, 0, m+1) {
rep(j, 0, 3) if(~ne[i][j]) {
int t = ne[i][j];
add(f[t][a+(j==0)][b+(j==1)][c+(j==2)], f[i][a][b][c]);
}
}
}
int ans = 0, l = n/3, r = m;
rep(i, 1, n+1) {
rep(a, l, r+1) rep(b, l, r+1) rep(c, l, r+1) if(a+b+c==n) {
add(ans, f[i][a][b][c]);
}
}
cout << ans << endl;
return 0;
}

codeforces 17C Balance(动态规划)的更多相关文章

  1. [Codeforces 17C] Balance

    Brief Introduction: 给定一个仅由abc组成的字符串,每个字符可以向左右延展,求最终新的平衡字符串的个数. Algorithm: 关键点在于变换前后字符串中字符的相对位置不会发生改变 ...

  2. Codeforces Flipping game 动态规划基础

    题目链接:http://codeforces.com/problemset/problem/327/A 这道题目有O(N^3)的做法,这里转化为动态规划求解,复杂度是O(N) #include < ...

  3. Codeforces 955F Heaps - 动态规划

    题目传送门 传送点I 传送点II 传送点III 题目大意 给定一棵以1为根的树,定义$dp_{k}(u)$表示在$u$的子树内存在的深度最大的满k叉树的深度,求$\sum_{u = 1}^{n}\su ...

  4. Codeforces Gym 101623A - 动态规划

    题目传送门 传送门 题目大意 给定一个长度为$n$的序列,要求划分成最少的段数,然后将这些段排序使得新序列单调不减. 考虑将相邻的相等的数缩成一个数. 假设没有分成了$n$段,考虑最少能够减少多少划分 ...

  5. poj 1837 Balance 动态规划 (经典好题,很锻炼思维)

    题目大意:给你一个天平,并给出m个刻度,n个砝码,刻度的绝对值代表距离平衡点的位置,并给出每个砝码的重量.达到平衡状态的方法有几种. 题目思路:首先我们先要明确dp数组的作用,dp[i][j]中,i为 ...

  6. Codeforces 1110D. Jongmah 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1110D.html 题意 给定 n 个数,每一个数都是在 [1,m] 里的整数. 从中取出形如 {x,x,x ...

  7. 近期做的一些DP

    UVa 1625 color length https://blog.csdn.net/Dylan_Frank/article/details/52261424 https://www.cnblogs ...

  8. 【Codeforces自我陶醉水题篇~】(差17C code....)

    Codeforces17A 题意: 有一种素数会等于两个相邻的素数相加 如果在2~n的范围内有至少k个这样的素数,就YES,否则就NO; 思路: 采用直接打表,后面判断一下就好了.那个预处理素数表还是 ...

  9. Codeforces

    Codeforces 7E #include <iostream> #include <cstring> #include <cstdio> #include &l ...

随机推荐

  1. svn 改英文

  2. 以安全模式启动firefox

    碰到firefox打开后一直没有响应,解决方法: 以安全模式打开

  3. bootstrap table demo

    js 代码 //搜索 function searchTable(){ var searchInfo = $("#searchForm").serializeJsonObject() ...

  4. [转]从客户端中检测到有潜在危险的Request.Form值的详细解决

    本文转自:http://www.knowsky.com/887593.html asp.net1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力.当用户试图用之类的输入影响页面返回结 ...

  5. Office 卸载问题(安装包的语言不受系统支持)

    本人系统Win7 这个问题搞了一下午.各种网站找解决办法.下载下来的都是一些垃圾软件. Win7以上调成兼容模式运行理论可行. 放上微软的解决方法: * 彻底卸载Office 2003: http:/ ...

  6. Odata简介和Demo

    转:http://www.cnblogs.com/shanyou/archive/2013/06/11/3131583.html 在SOA的世界中,最重要的一个概念就是契约(contract).在云计 ...

  7. 十六、Condition等待通知

    一.简介 我们可以使用syncronized和wait,notify实现等待通知.而syncronized的高级实现Lock,也可以实现等待通知,需要构造Condition的实例对象. JDK文档:h ...

  8. xshell 中解决中文乱码问题

    点击菜单栏 文件 -> 属性 在属性对话框内点击终端, 选择 编码为 UTF-8 即可.

  9. Golang把所有包括底层类库,输出到stderr的内容, 重新定向到一个日志文件里面?

    不论应用是如何部署的,我们都期望能扑捉到应用的错误日志, 解决思路: 自己写代码处理异常拦截,甚至直接在main函数中写异常拦截. stderr重定向到某个文件里 使用 syscall.Dup2 第一 ...

  10. WinForm实现Rabbitmq官网6个案例-RPC

    获取源码 客户端代码: namespace RabbitMQDemo { public partial class RPC : Form { private readonly static RPC _ ...