首页 > 其他分享 >[NOIP2015 提高组] 子串 【计数dp】

[NOIP2015 提高组] 子串 【计数dp】

时间:2023-01-12 12:22:21浏览次数:60  
标签:子串 NOIP2015 const int maxm include dp

题面

https://www.luogu.com.cn/problem/P2679

分析

CCF数据真的水。不过还是要写下正解:

令\(dp[i][j][t][0/1]\)表示\(a\)串前\(i\)个字符,\(b\)串前\(j\)个字符,匹配子串数位t,且第\(i\)位选/不选的方案数。实质上我们是在用\(a\)串匹配\(b\)串,也就是说,一旦匹配上了才会移动\(b\)串的下标,否则只是在对\(i\)进行考虑。

如果第\(i\)位不选,显然\(dp[i][j][t][0]=(dp[i-1][j][t][0]+dp[i-1][j][t][1])\%mod\)

如果\(a[i]=b[j]\),那么\(dp[i][j][t][1]\)有以下几种选择:

  • 与\(i-1\)合并成为一个子串,即\(dp[i-1][j-1][t][1]\)

  • 单独作为一个子串,即\(dp[i-1][j-1][t-1][0]+dp[i-1][j-1][t-1][1]\)

如果\(a[i] \neq b[j]\),显然\(dp[i][j][t][1]=0\)。

这样下来的空间是会被卡的,考虑滚动i变为0/1,即\(dp[0/1][j][t][0/1]\),这也是很套路的一步了。

优化后时间复杂度\(O(nm^2)\)

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
const int maxn = 1000 + 10;
const int maxm = 200 + 10;
const int mod = 1e9 + 7;
char a[maxn], b[maxm];
int dp[2][maxm][maxm][2];
int n, m, k;

int main() {
    cin >> n >> m >> k;
    scanf("%s%s", a + 1, b + 1);
    dp[0][0][0][0] = dp[1][0][0][0] = 1;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) {
            for (int t = 1; t <= k; t++) {
                int opt = i & 1;
                if (a[i] == b[j]) {
                    dp[opt][j][t][0] = (dp[opt ^ 1][j][t][0] + dp[opt ^ 1][j][t][1]) % mod;
                    dp[opt][j][t][1] =
                            (dp[opt ^ 1][j - 1][t][1] +
                             (dp[opt ^ 1][j - 1][t - 1][0] + dp[opt ^ 1][j - 1][t - 1][1]) % mod) %
                            mod;
                } else {
                    dp[opt][j][t][0] = (dp[opt ^ 1][j][t][0] + dp[opt ^ 1][j][t][1]) % mod;
                    dp[opt][j][t][1] = 0;
                }
            }
        }

    printf("%d", (dp[n & 1][m][k][0] + dp[n & 1][m][k][1]) % mod);
}

标签:子串,NOIP2015,const,int,maxm,include,dp
From: https://www.cnblogs.com/MrWangnacl/p/17046277.html

相关文章

  • 数位 DP
    2023.1.9省选模拟赛IA【题意】给定\(x,y\),求\[\sum\limits_{i\in[0,2^k-x)}\sum\limits_{j\in[y,2^k)}[i\&j=0]\times[(i+x)\&(j-y)=0]\]\(......
  • UDP
    UDPUDP是一种全双工通信协议。UDP协议首部中有一个16位的大长度.也就是说一个UDP能传输的报文长度是64K(包含UDP首部)。如果我们需要传输的数据超过64K,就需要在应用层......
  • JUC源码学习笔记5——1.5w字和你一起刨析线程池ThreadPoolExecutor源码,全网最细doge
    源码基于JDK8文章1.5w字,非常硬核系列文章目录和关于我一丶从多鱼外卖开始话说,王多鱼给好友胖子钱让其投资,希望亏得血本无归。胖子开了一个外卖店卖国宴,主打高端,外卖......
  • 单调队列优化DP
    今天学习了单调队列优化DP,其模型为:\[f_i=\min/\max_{L(i)\lej\leR(i)}\lbracekf_j+val(i,j)\rbrace\]其中\(L,R\)是具有单调性的函数,\(val(i,j)=h_1(i)+h_2(j)\),是分......
  • 关于华普物联HP-ERS-T200串口服务器UDP 连接互联网服务器操作案例
    本案例使用“路由侠”模拟互联网服务器,使用“路由侠”生成的外网地址进行测试。   硬件连接 将HP-ERS-T200通过USB转RS232串口线连接到PC的USB口上,HP......
  • 关于华普物联HP-ERS-T200串口服务器UDP局域网通讯案例
    硬件连接两个HP-ERS-T200分别通过USB转RS232串口线连接到PC的USB口上,通过上位机设置参数,设置完参数后,将两个HP-ERS-T200通过网线直连。 电脑COM口号确认......
  • 理解wordpress中的taxonomy category与term
    最近接触了很多PHP的东西,也学到了很多新的,就想着也利用热乎的知识优化一下基于​​Wordpress​​的极风游官网。实际操作过程中,发现其实除了php的知识以外,wordpress也还是......
  • 【做题笔记】动态规划专题(DP)
    这里记录笔者这几天做的有关于dp的题目。树形dp#1P1122最大子树和题目链接:https://www.luogu.com.cn/problem/P1122题意:选出一个联通分量,使得联通分量的点的点权......
  • 基于单调性的 dp 优化
    决策单调性决策单调性一般用于最优性问题当中,即一个状态只能从一个最优的状态转移,该最优状态称之为最优点。决策单调性就是指最优点随dp转移单调移动。一般如果能够将......
  • stream TCP&UDP反向代理配置,设置stream 日志打印格式
    stream{    log_formatldyhttps            '$remote_addr|[$time_local]|$protocol|$status|$connection|$session_time|$upstream_connect_time|'......