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. 微信小程序base64编码解码以及utf-8解码

    function base64_encode (str) { // 编码,配合encodeURIComponent使用 var c1, c2, c3; var base64EncodeChars = ...

  2. grub ubuntu启动

    set root=(hd0,gpt10) 现在变为 gpt9 了 安装固态后.变成了 (hd1,gpt11) set prefix=(hd0,gpt10)/boot/grub insmod norma ...

  3. Death Note

    注:本文系作者原创,但可随意转载. ********************************************************************************** ...

  4. centos7.6升级ssh7.9、安装PHP7.2、Nginx1.15.9、PHP加密扩展php_screw1.5

    1.centos7 安装PHP7.2版本 #查询是否安装过php yum list installed | grep php yum provides php #移除php yum remove ph ...

  5. Liberty中应用的contextroot

    参考:http://www-01.ibm.com/support/knowledgecenter/api/content/SSEQTP_8.5.5/com.ibm.websphere.wlp.doc/ ...

  6. 【BZOJ2648】SJY摆棋子 [KD-tree]

    SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 这天,SJY显得无聊.在家自己 ...

  7. [POJ1082&POJ2348&POJ1067&POJ2505&POJ1960]简单博弈题总结

    鉴于时间紧张...虽然知道博弈是个大课题但是花一个上午时间已经极限了... 希望省选过后再回过头来好好总结一遍吧. 接下来为了看着顺眼一点...还是按照难度顺序吧   POJ1082 一道最简单的博弈 ...

  8. float/文档流

    float : left | right | none | inherit; 文档流是文档中可显示对象在排列时所占用的位置. 浮动的定义: 使元素脱离文档流,按照指定方向发生移动,遇到父级边界或者相邻 ...

  9. ThinkPHP 多应用多模块建立方式

    ThinkPHP3.2.2及以后版本同一应用多模块和多应用多模块的设计已经比以前的版本更加简单快捷. 注:入口文件为index.php,内容为: <?php // +-------------- ...

  10. C# 文件类的操作---获取

    如何获取指定目录包含的文件和子目录 . DirectoryInfo.GetFiles():获取目录中(不包含子目录)的文件,返回类型为FileInfo[],支持通配符查找: . DirectoryIn ...