51nod动态规划入门--最长公共子序列
2016-03-23 19:06
302 查看
题目:给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
输入
输出
输入示例
输出示例
代码如下:
输入
第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)
输出
输出最长的子序列,如果有多个,随意输出1个。
输入示例
abcicba abdkscab
输出示例
abca
代码如下:
#include<stdio.h> #include<string.h> #include<algorithm> #include<queue> using namespace std; char A[1010],B[1010]; int LCS[1010][1010]; int b[1010][1010]; void PrintLCS(int d[][1010], char *x, int i, int j) { if(i==0 || j==0) return; if(d[i][j]==0) { PrintLCS(d,x,i-1,j-1); printf("%c",x[i-1]); } else if(d[i][j]==1) PrintLCS(d,x,i-1,j); else PrintLCS(d,x,i,j-1); } //void P(char *x){ // int l=strlen(x); // for(int i=0;i<l;i++){ // printf("%c ",x[i]); // } //} int main(){ int x,y; while(scanf("%s%s",A+1,B+1)!=EOF){ int l1=strlen(A+1); int l2=strlen(B+1); for(x=0;x<=l1;x++){ for(y=0;y<=l2;y++){ if(x==0||y==0){ LCS[x][y]=0; b[x][y]=0; } else if(A[x]==B[y]){ LCS[x][y]=LCS[x-1][y-1]+1; b[x][y]=0; } else if(LCS[x-1][y]>=LCS[x][y-1]){ LCS[x][y]=LCS[x-1][y]; b[x][y]=1; } else{ LCS[x][y]=LCS[x][y-1]; b[x][y]=-1; } } } PrintLCS(b, A+1, l1, l2); printf("\n"); // P(A+1); } return 0; }
相关文章推荐
- css中hover伪类的bug
- 通用的用户登录过滤器(SessionFilter)
- 贪心算法 水题 求中间数(problem Q)
- Qt5以上QMYSQL driver not loaded问题
- prim 与 dijkstra 的区别
- C - Line——(扩展欧几里得算法)
- 三菱机器人中断简介
- iOS-3D touch相关开发
- 第二周项目4:穷举法解决组合问题(4)
- DP泛做
- 最大公约数与最小公倍数————多种方法
- junit的使用
- 第三周内容
- C++获取数组的长度(用模板可以实现)
- uvalive 7480 Association for Control Over Minds
- JDBC
- Python~第三方模块
- Java——文本组件:JTextComponent
- HDU-2546-饭卡
- 计划