bzoj3075 [Usaco2013]Necklace dp+kmp
来源:互联网 发布:武汉java培训 编辑:程序博客网 时间:2024/06/01 18:32
挺好的dp题。
设f[i][j]表示走到a串的第i位,已经匹配了b串的前j位,然后kmp转移就好了。
具体看代码。
#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define inf 0x7f7f7f7fusing namespace std;const int N=1e5+5;typedef long long ll;int next[N];char a[N],b[N];int n,m,x;int f[3][1005];int main(){ scanf("%s%s",a+1,b+1); n=strlen(a+1); m=strlen(b+1); int j=0; fo(i,2,m) { while(j&&b[i]!=b[j+1])j=next[j]; if (b[i]==b[j+1])j++; next[i]=j; } fo(i,1,m-1)f[0][i]=-1; fo(i,1,n) { //x^=1; fo(j,0,m-1)f[x^1][j]=-1; fo(j,0,m-1)if (~f[x][j]) { f[x^1][j]=max(f[x^1][j],f[x][j]); int k=j; while (k&&b[k+1]!=a[i])k=next[k]; if (b[k+1]==a[i]) k++; f[x^1][k]=max(f[x^1][k],f[x][j]+1); } x^=1; } int ans=0; fo(i,0,m-1)ans=max(ans,f[x][i]); printf("%d\n",n-ans); return 0;}
阅读全文
0 0
- bzoj3075 [Usaco2013]Necklace dp+kmp
- 概率DP A1295 necklace
- 状压dp Necklace
- Necklace (状态dp)
- USACO2013 Nov. Gold T3,一道集合DP
- 3312: [Usaco2013 Nov]No Change 状压DP
- bzoj3126[Usaco2013 Open]Photo 单调队列+dp
- bzoj3312[Usaco2013 Nov]No Change 状压DP
- [Usaco2013 Open]Photo(dp+单调队列)
- bzoj 3126: [Usaco2013 Open]Photo dp
- hdu 2660 Accepted Necklace(dp)
- 1.1.4 Broken Necklace【DP】
- [BZOJ3049][Usaco2013 Jan]Island Travels(dfs+spfa+状压dp)
- 【bzoj 3049】[Usaco2013 Jan]Island Travels(状压dp)
- bzoj 3126: [Usaco2013 Open]Photo (DP+单调队列)
- [bzoj3312][Usaco2013 Nov][DP]No Change不找零
- 【USACO-Chapter1-1.1】【DP】Broken Necklace
- [USACO Training] Broken Necklace (DP)
- 【算法】求区间并集的长度
- Java实现数字签名算法
- 一招搞定多Offer选择问题
- 详解C语言中的stdin,stdout,stderr
- Day03-Android发展史概要
- bzoj3075 [Usaco2013]Necklace dp+kmp
- java关键字之static
- 测试的那点事-稳定性测试
- NS2初学笔记(二)之 ns2基本结构与交互问题
- 读取json
- Together项目IOS平台开发06
- 基于JZ2440之LINUX内核与U-BOOT分区修改
- Android Studio多渠道打包
- spring cloud 服务注册中心