博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串匹配dp+bitset,滚动数组优化——hdu5745(经典)
阅读量:5237 次
发布时间:2019-06-14

本文共 1286 字,大约阅读时间需要 4 分钟。

bitset的经典优化,即把可行性01数组的转移代价降低

bitset的适用情况,当内层状态只和外层状态的上一个状态相关,并且内层状态的相关距离是一个固定的数,可用bitset,换言之,能用滚动数组是能用bitset优化的前提

/*dp[i,j][0|1|2]表示p串的第i位,s串的第j位相匹配,pi和pi-1换,pi不换,pi和pi+1换的状态下是否能匹配dp[i,j][0] = dp[i-1,j-1][2] & p[i-1]==s[j]dp[i,j][1] = (dp[i-1,j-1][1] || dp[i-1,j-1][2]) & p[i]==s[j] dp[i,j][2] = (dp[i-1,j-1][0] || dp[i-1,j-1][1]) & p[i+1]==s[j]由于dp是01数组,并且dp[i]的所有状态都由dp[i-1]得到,所以我们可以考虑用bitset优化j观察原来的dp方程 dp[i][0]由dp[i-1][2]<<1 & p[i-1]和s[1..j] 得到 dp[i][1]由dp[i-1][1|2]<<1 & p[i]和s[1..j] 得到dp[i][2]由dp[i-1][0|1]<<1 & p[i+1]和s[1..j] 得到 那么我们再预处理一下s数组和26个字符比较的bitset数组即可 */#include
using namespace std;#define maxn 100005#define maxm 5005bitset
dp[3][3];bitset
f[26];int n,m;char s[maxn],p[maxm];void init(){
//处理f数组 for(int i=0;i<26;i++)f[i].reset(); for(int j=0;j
>t; while(t--){ scanf("%d%d",&n,&m); scanf("%s%s",&s,&p); init(); for(int i=0;i<2;i++) for(int j=0;j<3;j++) dp[i][j].reset(); //处理初始状态:即p[0]或p[1] 和s[1..j]的匹配 dp[0][1]=f[p[0]-'a']; if(m>1) dp[0][2]=f[p[1]-'a']; //然后刷表从p[1]转移到p[m] ,滚动数组节省空间 int cur=0; for(int i=1;i

 

转载于:https://www.cnblogs.com/zsben991126/p/11181360.html

你可能感兴趣的文章
Java反射之修改常量值
查看>>
用UIWebView加载本地图片和gif图
查看>>
jmeter远程分布执行遇到的网卡坑(A Test is currently running,stop or ....)
查看>>
Python正则表达式中的re.S
查看>>
Xcode 中设置部分文件ARC支持
查看>>
iOS-解决iOS8及以上设置applicationIconBadgeNumber报错的问题
查看>>
亡灵序曲-The Dawn
查看>>
_cdecl与_stdcall区别
查看>>
MySQL中的隔离级别和悲观锁及乐观锁示例
查看>>
手机端h5 ajax 上传图片支持微信内置浏览器
查看>>
【Maven】Mac 使用 zsh 后 mvn 命令就无效
查看>>
移动的彩虹
查看>>
Redmine
查看>>
HtmlEditor常用模式
查看>>
Another app is currently holding the yum lock; waiting for it to exit.. yum被锁定无法使用
查看>>
52.tableViewCell重用机制避免重复显示问题
查看>>
帧的最小长度 CSMA/CD
查看>>
xib文件加载后设置frame无效问题
查看>>
第一次博客
查看>>
Java Map 常见用法举例
查看>>