题意

定义F(x)为F(x-1)与F(x-2)的连接(其中F(0) = ‘0’,F(1) = ‘1’)。
给出一个长度不超过100的字符串s,询问s在F(x)的所有子序列中出现了多少次。


题解

数量很大的计数问题,我们首先想到的解决方案就是dp。
我们考虑F(x) = F(x-1) + F(x-2)
是由两部分构成的,我们可以分治来计算。
s[1,n]在F(x)中出现的次数由几部分构成:

  • s[1,n]s[1,n]s[1,n]在F(x−1)F(x−1)F(x-1)中出现的次数乘以2len(F(x−2))2len(F(x−2))2^{len(F(x-2))}
  • s[1,n]s[1,n]s[1,n]在F(x−2)F(x−2)F(x-2)中出现的次数乘以2len(F(x−1))2len(F(x−1))2^{len(F(x-1))}
  • s[1,k]s[1,k]s[1,k]在F(x−1)F(x−1)F(x-1)中出现的次数*s[k+1,n]s[k+1,n]s[k+1,n]在F(x−2)F(x−2)F(x-2)中出现的次数

我们定义状态dp[i][l][r]dp[i][l][r]dp[i][l][r]表示s[l,r]s[l,r]s[l,r]在F(i)F(i)F(i)的所有子序列中出现的次数。
那么

dp[i][l][r]+=dp[i−1][l][r]∗2len(F(i−2));当r==n时候dp[i][l][r]+=dp[i−1][l][r]∗2len(F(i−2));当r==n时候dp[i][l][r] += dp[i-1][l][r]*2^{len(F(i-2))};当r == n时候

解释:当r==n的时候,由于s[l,r]已经在F(i-1)中结尾了,所以F(i-2)中可以随便选取组成新的字串。

dp[i][l][r]+=dp[i−1][l][r]∗1;当r!=n时候dp[i][l][r]+=dp[i−1][l][r]∗1;当r!=n时候dp[i][l][r] += dp[i-1][l][r]*1;当r != n时候

解释:当r!=n的时候,由于s[l,r]没有在F(i-1)中结尾,此时如果取F(i-2)中字符的话,会给后面造成影响,即拼接出的包含s不是连续的。

dp[i][l][r]+=dp[i−2][l][r]∗2len(F(i−1));当l==1时候dp[i][l][r]+=dp[i−2][l][r]∗2len(F(i−1));当l==1时候dp[i][l][r] += dp[i-2][l][r]*2^{len(F(i-1))};当l == 1时候
dp[i][l][r]+=dp[i−2][l][r]∗1;当l!=1时候dp[i][l][r]+=dp[i−2][l][r]∗1;当l!=1时候dp[i][l][r] += dp[i-2][l][r]*1;当l != 1时候

然后就是s[l,r]s[l,r]s[l,r]分两段s[l,k]s[l,k]s[l,k]在F(i−1)F(i−1)F(i-1)里面和s[k+1,r]s[k+1,r]s[k+1,r]在F(i−2)F(i−2)F(i-2)里面。
dp[i][l][r]+=dp[i][l][k]∗dp[i][k+1][r],l<=k<rdp[i][l][r]+=dp[i][l][k]∗dp[i][k+1][r],l<=k<rdp[i][l][r] += dp[i][l][k]*dp[i][k+1][r],l


实现代码

#include <iostream>
#include <cstdio>
using namespace std;
#define pr(x) cout<<#x<<':'<<x<<endl
typedef long long ll;
const int maxn = 107;
const ll mod = 1e9+7;
ll dp[maxn][maxn][maxn];
char s[maxn];
int n,m;
ll modpow2[maxn];
int main(){scanf("%d%d",&m,&n);scanf(" %s",s);modpow2[0] = modpow2[1] = 2;for(int i = 2;i <= n;++i)modpow2[i] = modpow2[i-1]*modpow2[i-2]%mod;for(int i = 0;i < m;++i){dp[s[i]-'0'][i+1][i+1] = 1;}for(int i = 2;i <= n;++i){for(int l = 1;l <= m;++l){for(int r = l;r <= m;++r){dp[i][l][r] += dp[i-1][l][r]*(r == m?modpow2[i-2]:1)%mod;dp[i][l][r] += dp[i-2][l][r]*(l == 1?modpow2[i-1]:1)%mod;for(int k = l;k < r;++k){dp[i][l][r] += dp[i-1][l][k]*dp[i-2][k+1][r]%mod;}dp[i][l][r] %= mod;}}}cout<<dp[n][1][m]<<endl;return 0;
}

codeforces F.Fibonacci String Subsequences相关推荐

  1. Codeforces Round #674 (Div. 3) F. Number of Subsequences 简单计数dp

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的串,包含a,b,c,?a,b,c,?a,b,c,?四种字符,其中???可以变成为a,b,ca,b,ca,b,c的任意一种,让你求abca ...

  2. Codeforces Round #797 (Div. 3) F. Shifting String题解

    题意是给一个字符串s和一个与之相同长度的数组排列a,字符串s按照数组给定的位置进行变化,新字符串的第i个字符是上一个字符串的第a[i]个字符 比如 例子 5 ababa 2 1 4 5 3 变化6次 ...

  3. CodeForces - 1535C Unstable String(思维)

    题目链接:点击查看 题目大意:规定一个字符串将问号都替换成 000 或 111 后满足 010101 交替的话,该字符串是合法的,现在给出一个长度为 nnn 的字符串,求合法子串的个数 题目分析:两种 ...

  4. .f' '或者.F' '或者string.format(args)

    1,格式化字符串 {var} 作为占位符 Year = 2020f 'Today is {Year}'# f.'my py coding... {var}' F.'my py coding {var} ...

  5. 【CodeForces - 827A】String Reconstruction(并查集合并区间,思维)

    题干: Ivan had string s consisting of small English letters. However, his friend Julia decided to make ...

  6. CodeForces 797C Minimal string

    栈. 先处理一下后缀最小值. 对于每一个字符,如果不是后缀最小值,将栈顶小于当前后缀最小值的都弹出,然后压入当前字符. 如果是后缀最小值,将栈顶小于当前后缀最小值的都弹出,再输出该字符. #inclu ...

  7. Codeforces 797C Minimal string【贪心】

    题意: 给出了字符串s的内容,字符串t,u初始默认为空,允许做两种操作: 1.把s字符串第一个字符转移到t字符串最后. 2.把t字符串最后一个字符转移到u字符串最后. 最后要求s.t字符串都为空,问u ...

  8. CodeForces - 1426F Number of Subsequences(dp)

    题目链接:点击查看 题目大意:给出一个长度为 n 的字符串,由 ' a ' , ' b ' , ' c ' 和 ' ? ' 组成,每一个 ' ? ' 都可以变成三个字母之一,这样的话假设有 k 个 ' ...

  9. CodeForces - 1252D Find String in a Grid(AC自动机)

    题目链接:点击查看 题目大意:给出一个 n * m 的字符矩阵,再给出 q 次询问,每次询问需要回答给出字符串在字符矩阵中出现了多少次,规定在字符矩阵中查找某个字符串,只能先向右 a 个单位,再向下 ...

最新文章

  1. 使用OpenCV和Imutils构建图像的蒙太奇效果
  2. 分布式事务的实现原理
  3. python求立方尾不变_蓝桥杯:单词分析——————Python
  4. Andorid Binder进程间通信---总结
  5. tkinter使用cefpython库_Python3.7 tkinter中嵌入网页(WebView),需要引入cefpython3
  6. idea启动提示用户代理问题
  7. linux下内存的统计和内存泄露问题的定位-转
  8. 使用CAFFE训练自己的数据集并单张图片测试的方法
  9. Java 将Word转为HTML的方法
  10. Qt网络编程-TcpClient入门Demo(1)
  11. 双系统下怎么卸载linux系统,双系统怎么卸载其中一个操作系统 双系统卸载其中一个操作系统方法...
  12. Proxmox VE的初试小探
  13. r语言怎么做经验分布_医学统计与R语言:对数正态分布与卡方分布
  14. 笔记本电脑无法连接网络并在网络状态中显示ipv4和ipv6无网络访问权限
  15. tp5.1使用json返回网址后出现的反斜杠问题
  16. PointRCNN:3D Object Proposal Generation and Detection from Point Cloud
  17. 笔记本html外接显示器,笔记本电脑外接显示器怎么设置?笔记本电脑接显示器实现双屏教程...
  18. 多系统折腾记录(老电脑MBR分区)
  19. 台式计算机经常使用的硬盘是什么尺寸,台式机固态硬盘多大合适
  20. 2018 Google I/O 开发者大会发布的那些新技术

热门文章

  1. 算法设计与分析——贪心算法——活动安排问题
  2. java中file_详细介绍Java中的File类
  3. linux find查找文件然后删除,linu查找find命令及删除7天前的文件
  4. [JS-DOM]事件监听机制
  5. [蓝桥杯2016决赛]阶乘位数-数论
  6. CUDA的global内存访问的问题
  7. P1447 [NOI2010]能量采集(mobius反演)
  8. CF750F. New Year and Finding Roots
  9. AcWing 1091. 理想的正方形
  10. L - Clock Master Gym - 102798L