最长公共子序列(LCS DP)
2016-05-17 21:47
260 查看
状态:d[i][j],i,j表示下标,A[1~i]和B[1~j]的最长LCS
状态转移:d[i][j]--> 1)A[i]==B[j] d[i][j]=d[i-1][j-1]+1;
2)A[i]!=B[j] d[i][j]=max(d[i-1][j],d[i][j-1]);
状态转移:d[i][j]--> 1)A[i]==B[j] d[i][j]=d[i-1][j-1]+1;
2)A[i]!=B[j] d[i][j]=max(d[i-1][j],d[i][j-1]);
const int maxn=1000+5; int A[maxn],B[maxn],n1,n2,d[maxn][maxn]={0},path[maxn]; int main() { scanf("%d",&n1); for(int i=1;i<=n1;i++) cin>>A[i]; scanf("%d",&n2); for(int j=1;j<=n2;j++) cin>>B[j]; int p=0,ans=0; for(int i=1;i<=n1;i++) for(int j=1;j<=n2;j++) { if(A[i]==B[j]) d[i][j]=d[i-1][j-1]+1,path[p++]=A[i]; else d[i][j]=max(d[i-1][j],d[i][j-1]); ans=max(ans,d[i][j]); } // for(int i=1;i<=n1;i++) // { // for(int j=1;j<=n2;j++) // cout<<d[i][j]; // cout<<endl; // } cout<<ans<<endl; // for(int i=0;i<p;i++) cout<<path[i]<<' '; // cout<<endl; }
相关文章推荐
- Swift讲解专题十三——下标访问
- Activity的生命周期全名解析(一)典型情况下的生命周期
- Golang实现快速排序
- qte安装dbus
- Linux的inode的理解 [转]
- Codeforces Round #353 (Div. 2) C. Money Transfers 数学
- caffe 学习(2)——基本原理
- 二维树状数组 BZOJ 1452 [JSOI2009]Count
- ACM解题总结——HihoCoder1299
- 控制策略模型建模规范(STATEFLOW)
- eclipse运行时报errors occurred during the build. errors running builder "android package builder" on pro
- 翻译
- Android 图片的平移、缩放、倒影、旋转实现
- Git使用
- POJ 2447 Remmarguts' Date【k短路 SPFA+A* 模板题】
- CAS客户端基本配置备忘
- show一下自己的文档编写功底
- 算法导论之贪心算法:哈夫曼编码
- 控制策略模型建模规范(SIMULINK)
- Linux下apache安装