[Codeforces 17C] Balance
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的更多相关文章
- codeforces 17C Balance(动态规划)
codeforces 17C Balance 题意 给定一个串,字符集{'a', 'b', 'c'},操作是:选定相邻的两个字符,把其中一个变成另一个.可以做0次或者多次,问最后可以生成多少种,使得任 ...
- 近期做的一些DP
UVa 1625 color length https://blog.csdn.net/Dylan_Frank/article/details/52261424 https://www.cnblogs ...
- 【Codeforces自我陶醉水题篇~】(差17C code....)
Codeforces17A 题意: 有一种素数会等于两个相邻的素数相加 如果在2~n的范围内有至少k个这样的素数,就YES,否则就NO; 思路: 采用直接打表,后面判断一下就好了.那个预处理素数表还是 ...
- Codeforces
Codeforces 7E #include <iostream> #include <cstring> #include <cstdio> #include &l ...
- Codeforces Beta Round #17 C. Balance DP
C. Balance 题目链接 http://codeforces.com/contest/17/problem/C 题面 Nick likes strings very much, he likes ...
- 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 ...
- 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 ...
- Codeforces Round #599 (Div. 2) E. Sum Balance
这题写起来真的有点麻烦,按照官方题解的写法 先建图,然后求强连通分量,然后判断掉不符合条件的换 最后做dp转移即可 虽然看起来复杂度很高,但是n只有15,所以问题不大 #include <ios ...
- [Codeforces 1242C]Sum Balance
Description 题库链接 给你 \(k\) 个盒子,第 \(i\) 个盒子中有 \(n_i\) 个数,第 \(j\) 个数为 \(x_{i,j}\).现在让你进行 \(k\) 次操作,第 \( ...
随机推荐
- Website Collection
前一百个卡特兰数 Candy?的博弈论总结 杜教筛资料 线性基资料 (ex)BSGS资料 斐波那契数列前300项 斯特林数 STL标准库-容器-unordered_set C++ unordered_ ...
- java禁止实例化的工具类
public class Q { /** * @param args */ public static void main(String[] args) { new Person() } } clas ...
- Django随笔 01
Django 视图 不处理用户输入,而仅仅决定要展现哪些数据给用户: Django 模板 仅仅决定如何展现Django视图指定的数据. dd http://blog.csdn.net/pipisorr ...
- 初识 spl_autoload_register
spl_autoload_register 一.首先我们看来自官网的定义 版本要求:php版本为5.1.2+ 说明:注册给定的函数作为__autoload的实现.即自动加载 函数参数说明: bool ...
- 转:mybatis 高级结果映射(http://blog.csdn.net/ilovejava_2010/article/details/8180521)
高级结果映射 MyBatis的创建基于这样一个思想:数据库并不是您想怎样就怎样的.虽然我们希望所有的数据库遵守第三范式或BCNF(修正的第三范式),但它们不是.如果有一个数据库能够完美映射到所有应用程 ...
- centos 防火墙关闭/开启
从配置菜单关闭防火墙是不起作用的,索性在安装的时候就不要装防火墙查看防火墙状态:/etc/init.d/iptables status暂时关闭防火墙:/etc/init.d/iptables stop ...
- bzoj 1208 HNOI2004宠物收养所 平衡树
裸平衡树,恢复手感用的 //By BLADEVIL var n :longint; i :longint; x, y :longint; t, tot :longint; key, s, left, ...
- HDU1907(尼姆博弈)
John Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submis ...
- Selenium IDE安装和检查获取的控件路径技巧
来源:http://www.jianshu.com/p/0ea2dc83549f 从学习Selenium 开始,都是自己写脚本,后来得知有个插件Selenium IDE可以录制脚本,也懒得用了,觉得自 ...
- codevs 1085
数字游戏 2003年NOIP全国联赛普及组 时间限制: s 空间限制: KB 题目等级 : 黄金 Gold 题解 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但 ...