[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\) 次操作,第 \( ...
随机推荐
- 使用JavaScript时要注意的7个要素
每种语言都有它特别的地方,对于JavaScript来说,使用var就可以声明任意类型的变量,这门脚本语言看起来很简单,然而想要写出优雅的代码却是需要不断积累经验的.本文利列举了JavaScript初学 ...
- ios10 safari浏览器 在touchmove 里面写e.preventDefault(); 不起作用 的解决方法
最近做手机端项目遇到一个问题,就是在ios10系统里面 safari浏览器 在touchmove 里面写e.preventDefault();不起作用 更种google 还是没有找到解决方法 最后找 ...
- rsync 同步
1./usr/bin/rsync -vzrtopg --progress --include "weibo-service-server" --exclude "/*& ...
- css3中-moz、-ms、-webkit分别代表的意思
这三个分别是目前流行的三种浏览器的私有属性 -moz代表firefox浏览器私有属性 -ms代表ie浏览器私有属性(360浏览器是ie内核) -webkit代表safari.chrome私有属性 -o ...
- Linux下部署weblogic应用
1.Linux下weblogic安装 2.Linux下设置weblogic监听服务器地址(默认为本机) 1).修改domain\config\config.xml文件 修改 <server> ...
- Nginx的client_header_buffer_size和large_client_header_buffers学习
之前看到有人写的一篇关于nginx配置中large_client_header_buffers的问题排查的文章,其中提到: large_client_header_buffers 虽然也可以在serv ...
- 动态规划:LCIS
先给出状态转移方程: 定义状态 F[i][j]表示以a串的前i个整数与b串的前j个整数且以b[j]为结尾构成的LCIS的长度 状态转移方程: ①F[i][j] = F[i-][j] (a[i] != ...
- 编写类du命令Python脚本
#!/usr/bin/env python #_*_ coding:utf-8 _*_ #计算整个目录的大小,脚本接受-H参数,来加上适当的单位 #功能像du看齐 import os,sys from ...
- 转:Android 调试桥(adb)是多种用途的工具
转自:http://my.oschina.net/xuwa/blog/1574 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态. 可以通过下列几种方法加入 ...
- linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析【转】
转自:http://blog.csdn.net/ghostyu/article/details/8094049 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 预备知识 lin ...