Brief Introduction:

给定一个仅由abc组成的字符串,每个字符可以向左右延展,求最终新的平衡字符串的个数。

Algorithm:

关键点在于变换前后字符串中字符的相对位置不会发生改变

也就是说,将前后字符串unique后,B是A的子序列

问题转化为求A得子序列数

这样直接使用dp[cur][i][j][k] 配合 next[i][char] 转移即可

不过在实际实现中可以不用unique,直接在原字符串上转移也是同样的效果

Code:

#include <bits/stdc++.h>

using namespace std;
const int m=; int n,nxt[][],dp[][][][],res=;
char dat[]; bool check(int a,int b,int c)
{
if(abs(a-b)>) return false;
if(abs(a-c)>) return false;
if(abs(b-c)>) return false;
return true;
} int main()
{
cin >> n;
for(int i=;i<=n;i++) cin >> dat[i]; for(int i=n;i;i--)
{
nxt[i][]=nxt[i+][],nxt[i][]=nxt[i+][];
nxt[i][]=nxt[i+][],nxt[i][dat[i]-'a']=i;
} int most=n/+;dp[][][][]=;
for(int cur=;cur<=n;cur++)
for(int i=;i<=most;i++)
for(int j=;j<=most;j++)
for(int k=;k<=most;k++)
if(dp[cur][i][j][k])
{
if(i+j+k==n && check(i,j,k)) //向答案贡献的条件
res=(res+dp[cur][i][j][k])%m; int &a=dp[nxt[cur][]][i+][j][k];
int &b=dp[nxt[cur][]][i][j+][k];
int &c=dp[nxt[cur][]][i][j][k+];
a=(a+dp[cur][i][j][k])%m;
b=(b+dp[cur][i][j][k])%m;
c=(c+dp[cur][i][j][k])%m;
}
cout << res;
return ;
}

Review:

抓住不变量解题,发现相对位置不变使用类似 完全背包 的DP解题

[Codeforces 17C] Balance的更多相关文章

  1. codeforces 17C Balance(动态规划)

    codeforces 17C Balance 题意 给定一个串,字符集{'a', 'b', 'c'},操作是:选定相邻的两个字符,把其中一个变成另一个.可以做0次或者多次,问最后可以生成多少种,使得任 ...

  2. 近期做的一些DP

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

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

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

  4. Codeforces

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

  5. Codeforces Beta Round #17 C. Balance DP

    C. Balance 题目链接 http://codeforces.com/contest/17/problem/C 题面 Nick likes strings very much, he likes ...

  6. Codeforces Beta Round #17 C. Balance (字符串计数 dp)

    C. Balance time limit per test 3 seconds memory limit per test 128 megabytes input standard input ou ...

  7. Codeforces Round #599 (Div. 1) C. Sum Balance 图论 dp

    C. Sum Balance Ujan has a lot of numbers in his boxes. He likes order and balance, so he decided to ...

  8. Codeforces Round #599 (Div. 2) E. Sum Balance

    这题写起来真的有点麻烦,按照官方题解的写法 先建图,然后求强连通分量,然后判断掉不符合条件的换 最后做dp转移即可 虽然看起来复杂度很高,但是n只有15,所以问题不大 #include <ios ...

  9. [Codeforces 1242C]Sum Balance

    Description 题库链接 给你 \(k\) 个盒子,第 \(i\) 个盒子中有 \(n_i\) 个数,第 \(j\) 个数为 \(x_{i,j}\).现在让你进行 \(k\) 次操作,第 \( ...

随机推荐

  1. 【BZOJ 1124】[POI2008] 枪战Maf Tarjan+树dp

    #define int long long using namespace std; signed main(){ 这个题一看就是图论题,然后我们观察他的性质,因为一个图论题如果没有什么性质,就是真· ...

  2. SICAU-OJ:要我唱几首歌才能够将你捕捉

    要我唱几首歌才能够将你捕捉 题意: 有N种颜色的牛,现在可以执行以下两种操作: 1.抓捕一只牛,代价为ai: 2.花费x的代价使用魔法,让所有颜色加1,N会变为1. 求得到N种颜色的牛最少花费的代价. ...

  3. hdu 3473 (划分树)2

    Minimum Sum Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  4. sls语法:创建file,创建文件夹

    http://blog.kukafei520.net/html/2014/942.html /tmp/aaa.txt: file.managed /tmp/salt_test: file.direct ...

  5. 解读dbcp自动重连那些事

    转载自:http://agapple.iteye.com/blog/791943 可以后另一篇做对比:http://agapple.iteye.com/blog/772507 同样的内容,不同的描述方 ...

  6. loj6030 「雅礼集训 2017 Day1」矩阵

    传送门:https://loj.ac/problem/6030 [题解] 以下把白称为0,黑称为1. 发现只有全空才是无解,否则考虑构造. 每一列,只要有0的格子都需要被赋值1次,所以设有x列有含有0 ...

  7. [bzoj2631]tree——lct

    Brief Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: u v c:将u到v的路径上的点的权值都加上自然数c: u1 v1 u2 ...

  8. usaco 2000 contest 滑雪

    2013-09-11 10:22 [题目大意]给定N个点的高度和M条相连的路线(单向),从最高点向下走, 到无法走时为一条路径,求不同的路径数,(一节点不同就叫不同) [输入样例] 4 5   (N, ...

  9. 转:在android中button响应的两种方式

    1. 在布局文件中添加button的监听名字 Android:onClick="buttonOnClick" 例如: <Button android:id="@+i ...

  10. spin_lock浅析【转】

    转自:http://blog.csdn.net/frankyzhangc/article/details/6569475 版权声明:本文为博主原创文章,未经博主允许不得转载. 今天我们详细了解一下sp ...