hdu1503 Advanced Fruits (简单LCS)
2015-11-03 21:16
399 查看
典型最长公共子序列。
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <algorithm> using namespace std; #define maxn 105 int dp[maxn][maxn]; char str1[maxn],str2[maxn]; int len; struct node { int a,b; /*a记录字串1,并记录字串2*/ char ch; /*记录公共字符*/ }ans[maxn]; void LCS(int m,int n) { int i,j; memset(dp, 0, sizeof(dp)); for(i=1;i<=m;i++) for(j=1;j<=n;j++) if(str1[i]==str2[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); if(!dp[m] ) printf("%s%s",str1,str2); else { i=m; j=n; len=1; while(i!=0&&j!=0) { if(dp[i][j]==dp[i-1][j-1]+1&&str1[i]==str2[j])/*倒序记录位置*/ { ans[len].a=i; ans[len].b=j; ans[len++].ch=str1[i]; i--; j--; } else if(dp[i-1][j]>dp[i][j-1]) { i--; } else j--; } } len--;/*len复位*/ } int main() { int i,j,k; int len1,len2; while(~scanf("%s%s",str1+1,str2+1)) { len1=strlen(str1+1); len2=strlen(str2+1); LCS(len1,len2); i=1; j=1; for(k=len;k>0;k--) { while(i!=ans[k].a) { printf("%c",str1[i]); i++; } while(j!=ans[k].b) { printf("%c",str2[j]); j++; } printf("%c",ans[k].ch); i++; j++; } printf("%s%s\n",str1+1+ans[1].a,str2+1+ans[1].b); } return 0; }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray
- DP Flow
- zoj3605 Find the Marble(三维dp)