正题

P7152


题目大意

对于一个原串(只有四种字符),先将所有相邻且相同的字符分割开,对分割得到的若干段翻转,得到编辑后的字符串,现在给出编辑后的字符串(有一些位置不确定),问你有多少种符合的原串


解题思路

对于一个编辑后的字符串,考虑对其进行分割,那么分割合法要满足以下两个条件:

  1. 每一段中相邻位置不相同(如果相同,那么对于原串肯定会再分割)
  2. 对于相邻两段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相同即可)

那么对于新插入的一个字符考虑两种方案:

  1. 加入最后一段里,那么要保证新字符和c不同
  2. 新开一段,那么要保证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)相关推荐

  1. 【DP】Sleeping Cows P(P7154)

    正题 P7154 题目大意 有n头牛和n个牛棚,每头牛可以进入体积大于等于该牛的牛棚,当一个所有未进入牛棚的牛都不能再进时,称为极大的匹配,问你有多少种极大的匹配 解题思路 先把牛棚和牛放到一起,然后 ...

  2. 【DP】Mod Mod Mod(CF889E)

    正题 CF889E luogu 题目大意 给你 n 个数,让你选择一个X,使得 ∑i=1nXmoda1moda2...modai\sum_{i=1}^nX\mod a_1\mod a_2...\mod ...

  3. 【双指针】Square Pasture G(P7153)

    正题 P7153 题目大意 给你平面上的若干点,让你画一个正方形,问框住的点有多少种组合 解题思路 先枚举正方形左右两边的点,然后用双指针计算正方形移动过程中1框住的点 然后把所有点x,y坐标取反,再 ...

  4. 【BZOJ1797】[AHOI2009]最小割(网络流)

    [BZOJ1797][AHOI2009]最小割(网络流) 题面 BZOJ 洛谷 题解 最小割的判定问题,这里就当做记结论吧.(源自\(lun\)的课件) 我们先跑一遍最小割,求出残量网络.然后把所有还 ...

  5. 杜教筛模板(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 ...

  6. 【BZOJ1831】[AHOI2008]逆序对(动态规划)

    [BZOJ1831][AHOI2008]逆序对(动态规划) 题面 BZOJ 洛谷 题解 显然填入的数拎出来是不降的. 那么就可以直接大力\(dp\). 设\(f[i][j]\)表示当前填到了\(i\) ...

  7. 【原创】OllyDBG 入门系列(七)-汇编功能

    标 题: [原创]OllyDBG 入门系列(七)-汇编功能 作 者: CCDebuger 时 间: 2006-04-09,16:42:10 链 接: http://bbs.pediy.com/show ...

  8. 【机器人学】平面2R机器人(六)——MATLAB仿真

    前情回顾 [机器人学]平面2R机器人(一)--正运动学 [机器人学]平面2R机器人(二)--逆运动学 [机器人学]平面2R机器人(三)--速度雅可比矩阵 [机器人学]平面2R机器人(四)--正动力学 ...

  9. 【矩阵论】矩阵的相似标准型(1)

    矩阵的相似标准型之"特征值与特征向量" 本章目的: 对于给定的矩阵,找一个最简单的矩阵与之相似 对于给定的线性空间上的线性变换,找线性空间的一组基,使得线性变换的矩阵最简单. p. ...

最新文章

  1. Overall Comparision With WCDMA
  2. chmod修改文件夹权限
  3. matlab-画个拱桥和倒影?
  4. vmware ubuntu重置root密码
  5. php 绝对刷新,vue项目线上页面刷新报404 解决方法(绝对有用)
  6. 【java】序列化反序列化
  7. 神器 Wineskin 基础教程
  8. svn合并不同树_SVN分支与合并【超详细的图文教程】(转载)
  9. Linux 面试常考题总结大全【建议收藏】
  10. mysql 导出 客户端_Web基础配置篇(四): Mysql的配置及使用
  11. SpringBoot微信公众号开发
  12. linux 流量蠕虫 查杀,linux系统服务器中的蠕虫病毒怎么清除
  13. 2022年帝国CMS7.5内核精仿《5288商机网》二次开发多个功能,运营级
  14. 清华大学出版社计算机绘谱,清华大学出版社-图书详情-《土木与建筑类CAD技能一级(二维计算机绘图)AutoCAD培训教程》...
  15. 华为核心交换机HW_S7706添加静态路由
  16. 《增长黑客实战》(第4-6章)
  17. TDA2x平台新增link之修改软件框架links_fw
  18. java笔试多么_世界多么精彩!
  19. 【科普】HDMI vs DisplayPort vs DVI 傻傻分不清楚
  20. 记Global Protect安装的一次坑旅

热门文章

  1. python读取日志错误信息_关于修复 Bug 这件“小事”|利用Python 日志查找错误也可行...
  2. 双路服务器只显示一半内存,双路服务器只显示一半内存
  3. c语言随机数循环延迟,C语言生成随机数的函数、延时函数
  4. 如何手动连上mysql_如何手动安装MySql
  5. wordpress多站点主站调用分站最新文章_企业网站SEO最新的7个优化步骤!
  6. Java当中 递归打印文件大小(面向不同的对象打印文件大小)
  7. [MyBatisPlus]雪花算法
  8. [数据结构-严蔚敏版]P65离散事件模拟(银行客户的离散事件驱动模拟程序)
  9. C++ setprecision()用法
  10. [Java基础]线程安全的类