【DP】Bovine Genetics G(P7152)
正题
P7152
题目大意
对于一个原串(只有四种字符),先将所有相邻且相同的字符分割开,对分割得到的若干段翻转,得到编辑后的字符串,现在给出编辑后的字符串(有一些位置不确定),问你有多少种符合的原串
解题思路
对于一个编辑后的字符串,考虑对其进行分割,那么分割合法要满足以下两个条件:
- 每一段中相邻位置不相同(如果相同,那么对于原串肯定会再分割)
- 对于相邻两段a,b,a的首字符要和b的结尾字符相同(保证在原串中可以被分割)
可以考虑DP,设fi,chf_{i,ch}fi,ch为前i个字符已经分割好,且最后一段的首字符为ch的方案数,那么可以从i往后枚举,然后传递
但这样显然会TLE,题目有说到字符串只有四种字符,那么可以考虑从字符下手
设fi,a,b,cf_{i,a,b,c}fi,a,b,c为前i个字符串已经分割好了,且上一段首字符为a,当前段首字符为b,结尾字符为c的方案数(计算答案的时候保证a,c相同即可)
那么对于新插入的一个字符考虑两种方案:
- 加入最后一段里,那么要保证新字符和c不同
- 新开一段,那么要保证a,c不同
这样转移时间复杂度为O(n),常数为444^444,可以过
code
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 100010
#define wyc 1000000007
using namespace std;
int n,ans,v[N],f[N][5][5][5];
char c[N];
int main()
{scanf("%s",c+1);n=strlen(c+1);for(int i=1;i<=n;++i){if(c[i]=='?')v[i]=0;else if(c[i]=='A')v[i]=1;else if(c[i]=='C')v[i]=2;else if(c[i]=='G')v[i]=3;else v[i]=4;}for(int i=1;i<=4;++i)for(int j=1;j<=4;++j)if(v[1]==j||!v[1])f[1][i][j][j]=1;for(int i=1;i<n;++i)for(int c=1;c<=4;++c)if(!v[i]||v[i]==c)for(int a=1;a<=4;++a)for(int b=1;b<=4;++b){if(!v[i+1]){for(int d=1;d<=4;++d){//?的情况if(a==c)(f[i+1][b][d][d]+=f[i][a][b][c])%=wyc;if(c!=d)(f[i+1][a][b][d]+=f[i][a][b][c])%=wyc;}}else{if(a==c)(f[i+1][b][v[i+1]][v[i+1]]+=f[i][a][b][c])%=wyc;if(c!=v[i+1])(f[i+1][a][b][v[i+1]]+=f[i][a][b][c])%=wyc;}}for(int a=1;a<=4;++a)for(int b=1;b<=4;++b)(ans+=f[n][a][b][a])%=wyc;printf("%d",ans);return 0;
}
【DP】Bovine Genetics G(P7152)相关推荐
- 【DP】Sleeping Cows P(P7154)
正题 P7154 题目大意 有n头牛和n个牛棚,每头牛可以进入体积大于等于该牛的牛棚,当一个所有未进入牛棚的牛都不能再进时,称为极大的匹配,问你有多少种极大的匹配 解题思路 先把牛棚和牛放到一起,然后 ...
- 【DP】Mod Mod Mod(CF889E)
正题 CF889E luogu 题目大意 给你 n 个数,让你选择一个X,使得 ∑i=1nXmoda1moda2...modai\sum_{i=1}^nX\mod a_1\mod a_2...\mod ...
- 【双指针】Square Pasture G(P7153)
正题 P7153 题目大意 给你平面上的若干点,让你画一个正方形,问框住的点有多少种组合 解题思路 先枚举正方形左右两边的点,然后用双指针计算正方形移动过程中1框住的点 然后把所有点x,y坐标取反,再 ...
- 【BZOJ1797】[AHOI2009]最小割(网络流)
[BZOJ1797][AHOI2009]最小割(网络流) 题面 BZOJ 洛谷 题解 最小割的判定问题,这里就当做记结论吧.(源自\(lun\)的课件) 我们先跑一遍最小割,求出残量网络.然后把所有还 ...
- 杜教筛模板(P4213 【模板】杜教筛(Sum))
P4213 [模板]杜教筛(Sum) 套路推式子 求s(n)=∑i=1nf(i)∑i=1n(f∗g)(i)=∑i=1n∑d∣if(d)g(id)=∑d=1n∑i=1⌊nd⌋f(i)g(d)=∑d=1n ...
- 【BZOJ1831】[AHOI2008]逆序对(动态规划)
[BZOJ1831][AHOI2008]逆序对(动态规划) 题面 BZOJ 洛谷 题解 显然填入的数拎出来是不降的. 那么就可以直接大力\(dp\). 设\(f[i][j]\)表示当前填到了\(i\) ...
- 【原创】OllyDBG 入门系列(七)-汇编功能
标 题: [原创]OllyDBG 入门系列(七)-汇编功能 作 者: CCDebuger 时 间: 2006-04-09,16:42:10 链 接: http://bbs.pediy.com/show ...
- 【机器人学】平面2R机器人(六)——MATLAB仿真
前情回顾 [机器人学]平面2R机器人(一)--正运动学 [机器人学]平面2R机器人(二)--逆运动学 [机器人学]平面2R机器人(三)--速度雅可比矩阵 [机器人学]平面2R机器人(四)--正动力学 ...
- 【矩阵论】矩阵的相似标准型(1)
矩阵的相似标准型之"特征值与特征向量" 本章目的: 对于给定的矩阵,找一个最简单的矩阵与之相似 对于给定的线性空间上的线性变换,找线性空间的一组基,使得线性变换的矩阵最简单. p. ...
最新文章
- Overall Comparision With WCDMA
- chmod修改文件夹权限
- matlab-画个拱桥和倒影?
- vmware ubuntu重置root密码
- php 绝对刷新,vue项目线上页面刷新报404 解决方法(绝对有用)
- 【java】序列化反序列化
- 神器 Wineskin 基础教程
- svn合并不同树_SVN分支与合并【超详细的图文教程】(转载)
- Linux 面试常考题总结大全【建议收藏】
- mysql 导出 客户端_Web基础配置篇(四): Mysql的配置及使用
- SpringBoot微信公众号开发
- linux 流量蠕虫 查杀,linux系统服务器中的蠕虫病毒怎么清除
- 2022年帝国CMS7.5内核精仿《5288商机网》二次开发多个功能,运营级
- 清华大学出版社计算机绘谱,清华大学出版社-图书详情-《土木与建筑类CAD技能一级(二维计算机绘图)AutoCAD培训教程》...
- 华为核心交换机HW_S7706添加静态路由
- 《增长黑客实战》(第4-6章)
- TDA2x平台新增link之修改软件框架links_fw
- java笔试多么_世界多么精彩!
- 【科普】HDMI vs DisplayPort vs DVI 傻傻分不清楚
- 记Global Protect安装的一次坑旅
热门文章
- python读取日志错误信息_关于修复 Bug 这件“小事”|利用Python 日志查找错误也可行...
- 双路服务器只显示一半内存,双路服务器只显示一半内存
- c语言随机数循环延迟,C语言生成随机数的函数、延时函数
- 如何手动连上mysql_如何手动安装MySql
- wordpress多站点主站调用分站最新文章_企业网站SEO最新的7个优化步骤!
- Java当中 递归打印文件大小(面向不同的对象打印文件大小)
- [MyBatisPlus]雪花算法
- [数据结构-严蔚敏版]P65离散事件模拟(银行客户的离散事件驱动模拟程序)
- C++ setprecision()用法
- [Java基础]线程安全的类