字符串+dp——cf1163D好题
很好的题(又复习了一波kmp)
/*
dp[i,j,k]:到s1的第i位,匹配s2到j,s3到k的最优解
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 2005
int len1,len2,len3,dp[maxn][][],f2[],f3[];
char s1[maxn],s2[],s3[]; void kmp(char *s,int *f){
int len=strlen(s);
int i,j;
j=f[]=-,i=;
while(i<len){
while(j!=- && s[i]!=s[j])j=f[j];
f[++i]=++j;
}
} int main(){
scanf("%s%s%s",s1+,s2,s3);
len1=strlen(s1+);len2=strlen(s2);len3=strlen(s3);
for(int i=;i<=;i++)
for(int j=;j<;j++)
for(int k=;k<;k++)
dp[i][j][k]=-0x3f3f3f3f;
int ans=-0x3f3f3f3f;
dp[][][]=;
kmp(s2,f2),kmp(s3,f3);
for(int i=;i<=len1;i++)
for(int j=;j<=len2;j++)//这里一定要等于
for(int k=;k<=len3;k++)//从[i-1,j,k]状态推导到当前状态
if(dp[i-][j][k]!=-0x3f3f3f3f){
char L='a',R='z';
if(s1[i]!='*')L=R=s1[i];
for(char ch=L;ch<=R;ch++){//枚举第i位选的是字符ch
//找选了ch在s2,s3的匹配位置
int p2=j,p3=k,tmp=;
while(p2!=- && s2[p2]!=ch)
p2=f2[p2];
p2++;
while(p3!=- && s3[p3]!=ch)
p3=f3[p3];
p3++; if(p2==len2)tmp++;
if(p3==len3)tmp--;
dp[i][p2][p3]=max(dp[i][p2][p3],dp[i-][j][k]+tmp);
if(i==len1)
ans=max(ans,dp[i][p2][p3]);
}
}
cout<<ans<<endl;
}
字符串+dp——cf1163D好题的更多相关文章
- AtCoder Regular Contest 081 E - Don't Be a Subsequence(字符串DP)
引用自:onion_cyc 字符串DP一直不是强项...以后没思路的题就想DP和网络流23333333 f[i]表示从i开始的后缀非子序列的最短长度 pos[i][j]表示从i开始的j字符最早出现位 ...
- 【BZOJ 2121】 (字符串DP,区间DP)
2121: 字符串游戏 Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对于一个在集合S中的字符串p,如果p在L中出现,B ...
- NOIP2015Day2T2子串(字符串dp)
又被“if(a=b)”坑了QAQ...写C++还是得开Warning,这么久了pascal还没改过来咋回事啊QWQ 题目大意就不说了OWO 网上的题解都不怎么看得懂啊...好像写得都很乱?还是我太sb ...
- [NOIP2005] 过河【Dp,思维题,缩点】
Online Judge:Luogu P1052 Label:Dp,思维题,缩点,数学 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子 ...
- Codeforces 1150D(字符串dp)
反思 三维的dp压根没看出来,看题解以后思路又很直观,找几道字符串dp练练才行 序列自动机和优化一维略 /* __ __ * ____| |_____| |____ * | | * | __ | * ...
- 2017广东工业大学程序设计竞赛初赛 题解&源码(A,水 B,数学 C,二分 D,枚举 E,dp F,思维题 G,字符串处理 H,枚举)
Problem A: An easy problem Description Peter Manson owned a small house in an obscure street. It was ...
- [每日一题2020.06.09] leetcode #97 交错字符串 dp
题目链接 利用动态规划的思想, 对于每种状态(i, j)来说都有(i-1, j) 和 (i,j-1) 需要注意的问题 : 初始化的问题,先把i=0和j=0的状态都初始化后才可以进行dp否则发生数组越界 ...
- fzu2172 字符串dp
F - 巡了南山我巡北山 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- 51nod 1092 回文字符串 (dp)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1092 这个题是poj-3280的简化版,这里只可以增加字符,设 dp[i ...
随机推荐
- Socket心跳包异常检测的C语言实现,服务器与客户端代码案例
在Socket心跳机制中,心跳包可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能较大.本文实现的是由客户端给服务器发送心跳包,服务器不必返回应答包,而是通过判断客户在线 ...
- class3_Entry & Text 输入和文本框
程序总体运行效果图如下; #!/usr/bin/env python # -*- coding:utf-8 -*- # -------------------------------------- ...
- 剑指offer——18打印从1到最大的n位数
题目: 输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数999. 题解: 注意大数溢出问题,故使用字符串更靠谱 class Solution { pu ...
- mybatis 处理CLOB/BLOB类型数据
BLOB和CLOB都是大字段类型. BLOB是按二进制来存储的,而CLOB是可以直接存储文字的. 通常像图片.文件.音乐等信息就用BLOB字段来存储,先将文件转为二进制再存储进去.文章或者是较长的文字 ...
- POJ 1265 /// 皮克定理+多边形边上整点数+多边形面积
题目大意: 默认从零点开始 给定n次x y上的移动距离 组成一个n边形(可能为凹多边形) 输出其 内部整点数 边上整点数 面积 皮克定理 多边形面积s = 其内部整点in + 其边上整点li / 2 ...
- vc面试题目
class B { public: B() { cout << "default constructor" << endl; } ~B() { cout & ...
- C++之指针与数组区别
C++/C程序中,数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变.指针可以随时指向任意类型的内存 ...
- Erlang学习记录:相关工具和文档
在线工具和文档 网址 说明 OTP Reference Page Index 内置模块查询 Erlang/OTP Applications N Kernel Reference Manual 入门官方 ...
- Allegro文档错误之:Iangle 命令
Allegro绘制弧线时,可以使用add rarc命令,或者菜单栏里 Add|Arc w/Radius. 使用该命令时,需要输入3个参数: 1,圆心坐标:如 x –0.3 –0.8 2,半径,以及起始 ...
- C++ SOCKET 基础编程
{ http://c.biancheng.net/socket/ }