线性dp:P2679 子串

1.P2679 子串

传送门icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P2679这道题是公共子串问题的变种,但是我第一时间确实没想到转移方程(写少了)

一开始看了题解也没太看懂,直到自己模拟一遍(模拟数据便于理解原理)下面是感悟

这道题我最初的疑惑点在于究竟是定住a串找b串,还是定住b串找a串。我在一开始的想法是定住b串找a串,因为这道题我们想要用a串中的子串来匹配b串。但是后来我发现这不可行,因为a串只能按照顺序来找,如果定住b串,就不能保证后面补充的是从前面来的了,如此一来并不好操作(子串间连接顺序不同)。

这里还用到了一个优化,把第一维a串的遍历省掉了,因为每一次只与前一个位置的有关

下面直接用代码来解释(有注释)

Welcome - Luogu Spilopelia 配合这个食用

图摘自https://www.luogu.com.cn/article/k0zkdin9

// Problem: 
//     P2679 [NOIP2015 提高组] 子串
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2679
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<iostream>
using namespace std;
int f[2][205][205][2];//这个和上一个  / 匹配的m / 多少个子串 / 用或者不用这个a[i]
char a[1005],b[205];
const int P=1000000007;int main(){int n,m,k;cin>>n>>m>>k;cin>>(a+1)>>(b+1);f[0][0][0][0]=1;f[1][0][0][0]=1;  //不用a[i]满足0个b对应x个a的情况(0<=x<=n)这里x被简化成0/1了for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){for(int p=1;p<=k;++p){if(a[i]==b[j]){//如果这两个匹配f[i%2][j][p][1]=((f[(i-1)%2][j-1][p][1]+f[(i-1)%2][j-1][p-1][1])%P+f[(i-1)%2][j-1][p-1][0]%P)%P;f[i%2][j][p][0]=(f[(i-1)%2][j][p][0]+f[(i-1)%2][j][p][1])%P;}else{f[i%2][j][p][1]=0;f[i%2][j][p][0]=(f[(i-1)%2][j][p][0]+f[(i-1)%2][j][p][1])%P;//用这里收割从前面来的子串}}}}cout<<(f[n%2][m][k][0]+f[n%2][m][k][1])%P;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/505898.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从硬件角度看Linux的内存管理

1. 分页机制 分段机制的地址映射颗粒度太大&#xff0c;以整个进程地址空间为单位的分配方式导致内存利用率不高。 分页机制把这个分配机制的单位继续细化为固定大小的页(Page)&#xff0c;进程的虚拟地址空间也按照页来分割&#xff0c;这样常用的数据和代码就可以以页为单位…

VLAN实验报告

实验要求&#xff1a; 实验参考图&#xff1a; 实验过程&#xff1a; r1: [r1]int g 0/0/0.1 [r1-GigabitEthernet0/0/0.1]ip address 192.168.1.1 24 [r1-GigabitEthernet0/0/0.1]dot1q termination vid 2 [r1-GigabitEthernet0/0/0.1]arp broadcast enable [r1]int g 0/0/…

131. 分割回文串(力扣LeetCode)

文章目录 131. 分割回文串题目描述回溯代码 131. 分割回文串 题目描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1&#xff1a; 输入&#xf…

#WEB前端(DIV、SPAN)

1.实验&#xff1a;DIV、SPAN 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; 类? 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdev…

详细讲解Docker架构的原理、功能以及如何使用

一、简介 1、了解docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化&#xff0c;以便隔离进程和资源&#xff0c;而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中&…

Ps:历史记录面板

Ps菜单&#xff1a;窗口/历史记录 Window/History 历史记录 History面板提供了对图像编辑过程中所进行更改的深入控制&#xff0c;可以让用户回溯并查看每一步操作&#xff0c;从而允许用户轻松撤销错误或比较不同的编辑效果。 ◆ ◆ ◆ 常用操作方法与技巧 “历史记录”面板…

Redis之十:Spring Data Redis --- CrudRepository方式

SpringData Redis CrudRepository方式 Spring Data Redis 的 CrudRepository 是 Spring Data 框架中用于提供基础 CRUD&#xff08;创建、读取、更新和删除&#xff09;操作的一个接口。在与 Redis 集成时&#xff0c;尽管 Redis 是一个键值存储系统&#xff0c;并没有像关系型…

对象锁与类锁

不同锁互不影响&#xff0c;共用一个锁&#xff0c;可能会发生阻塞。 1.在修饰静态方法时&#xff0c;锁定的是当前类的 Class 对象&#xff0c;在下面的例子中就是SycTest1.class 2.当修饰非静态方法时&#xff0c;锁定的就是 this 对象&#xff0c;即当前的实例化对象 public…

基于springboot实现计算机类考研交流平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现计算机类考研交流平台系统演示 摘要 高校的大学生考研是继高校的高等教育更上一层的表现形式&#xff0c;教育的发展是我们社会的根本&#xff0c;那么信息技术的发展又是改变我们生活的重要因素&#xff0c;生活当中各种各样的场景都存在着信息技术的发展。…

chrome选项页面options page配置

options 页面用以定制Chrome浏览器扩展程序的运行参数。 通过Chrome 浏览器的“工具 ->更多工具->扩展程序”&#xff0c;打开chrome://extensions页面&#xff0c;可以看到有的Google Chrome扩展程序有“选项Options”链接&#xff0c;如下图所示。单击“选项Options”…

如何使用数据可视化库 D3 绘制折线统计图

如题&#xff0c;如何使用数据可视化库 D3 绘制折线统计图&#xff1f; 这篇文章将通过实例来讲解如何一步一步绘制下面这样一个折线统计图&#xff0c;并带有鼠标悬浮移动的文字显示效果。 首先&#xff0c;我们来看下什么是 d3&#xff1f;移步官网&#xff1a;https://d3js.…

Apple Mobile Device Driver

Apple Mobile Device Driver (Windows 10)原来安装过&#xff0c;突然不见了&#xff0c;可以尝试一下方法。 下载 Windows 版 iTunes - 官方 Apple 支持 (中国)