C++记忆化搜索算法与动态规划算法之公共子序列
来源:互联网 发布:淘宝清仓特卖 编辑:程序博客网 时间:2024/06/05 16:03
公共子序列
Description
现在给出两个序列X和Y,你的任务是找到X和Y的最大公共子序列,也就是说要找到一个最长的序列Z,使得Z既是X的子序列也是Y的子序列。
Input
Output
Sample Input
abcfbc abfcabprogramming contest abcd mnp
Sample Output
420
解题
看到这道题的时候,我发现这道题可以用3种方案,分别是深搜(TLE)、动态规划(AC)、记忆化搜索(AC)。
方法I:深搜
#include<bits/stdc++.h>using namespace std;string x,y;int lenx,leny,maxn;void dfs(int s,int t,int g){if(t>=lenx||g>=leny) return ;for(int i=t;i<lenx;i++){int j;for(j=g;j<leny;j++)if(x[i]==y[j])break;if(j==leny) continue;dfs(s+1,i+1,j+1);if(s>maxn) maxn=s;}}main(){while(cin>>x>>y){maxn=0;lenx=x.length();leny=y.length();dfs(1,0,0);cout<<maxn<<endl;}}
方法II:动态规划
#include<bits/stdc++.h>using namespace std;int ans,A[201][201],lenx,leny,flag[201][201];string x,y;void DP() { memset(A,0,sizeof(A)); for(int i=1;i<=lenx;++i) flag[i][0]=1; for(int i=1;i<=leny;++i) flag[0][i]=-1; for(int i=1;i<=lenx;++i) for(int j=1;j<=leny;++j) { if(x[i-1]==y[j-1]) { A[i][j]=A[i-1][j-1]+1; flag[i][j]=0; } else if(A[i-1][j]>=A[i][j-1]) { A[i][j]=A[i-1][j]; flag[i][j]=1; } else { A[i][j]=A[i][j-1]; flag[i][j]=-1; } }}void print(int x,int y) { if(!x&&!y) return ; if(flag[x][y]==0) { print(x-1,y-1); ans++; } else if(flag[x][y]==1) print(x-1,y); else print(x,y-1);}int main() { while(cin>>x>>y) {ans=0; lenx=x.size(); leny=y.size(); DP(); print(lenx,leny); printf("%d\n",ans); }}
方法III:记忆化搜索
#include<bits/stdc++.h>using namespace std;string x,y;int lenx,leny,A[201][201];int search(int i,int j){if(A[i][j]+1) return A[i][j];if(!i&&!j){if(x[i]==y[j])return A[i][j]=1;elsereturn A[i][j]=0;}if(!i){for(int k=j;k>=0;k--)if(x[i]==y[k])return A[i][j]=1;return A[i][j]=0;}if(!j){for(int k=i;k>=0;k--)if(x[k]==y[j])return A[i][j]=1;return A[i][j]=0;}if(x[i]==y[j]) return A[i][j]=1+search(i-1,j-1);else return A[i][j]=max(search(i,j-1),search(i-1,j));}int main(){while(cin>>x>>y){memset(A,-1,sizeof(A));cout<<search(x.length()-1,y.length()-1)<<endl;}}通过这道题我们可以发现,其实记忆化搜索和动态规划的关系就像递归和递推的关系一样,大多数时候可以相互转换。
阅读全文
1 1
- C++记忆化搜索算法与动态规划算法之公共子序列
- 记忆化搜索算法之动态规划
- 动态规划之最长公共子序列算法
- 算法知识之最长公共子序列问题(动态规划)
- 【算法导论】动态规划之最长公共子序列
- 算法导论之动态规划:最长公共子序列
- 动态规划之最长公共子序列(算法导论)
- 动态规划算法之最长公共子序列问题
- 算法动态规划之最长公共子序列
- 算法导论之动态规划:最长公共子序列
- 算法之最长公共子序列(动态规划)
- 1808:公共子序列(2.6基本算法之动态规划)
- 算法学习之动态规划--最长公共子序列
- 2.6基本算法之动态规划 /1808:公共子序列
- 动态规划算法之最长公共子序列问题
- 【算法】 动态规划 最长公共子序列
- 动态规划算法之:最长公共子序列 & 最长公共子串(LCS)
- 算法题9 动态规划之最长公共子序列&最长公共子串
- 纯css实现table表头固定
- PAT (Advanced Level) Practise 1061 Dating (20)
- 关于七大排序问题《三》
- PHP HTTP添加自定义头
- 输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
- C++记忆化搜索算法与动态规划算法之公共子序列
- 字段=“”与字段 is null
- 《Linux内核设计与实现》读书笔记(十五)- 进程地址空间(kernel 2.6.32.60)
- Android根据本地端口号寻找对应的用户UID和进程PID
- Android manifest(清单文件)标签详细介绍
- C++拷贝构造函数和赋值运算符根本的不同
- 自定义URL Protocol 协议
- php 判断ascii码(字典序)
- 学习rac管理