POJ2250
来源:互联网 发布:知乎 钢铁雄心3 编辑:程序博客网 时间:2024/04/28 07:37
最长公共子序列,用map对输入的字符串进行处理之后就只是一个LCS了.最后通过递归求出路径就搞定了.
#include <iostream>#include <map>#include <cstdio>#include <cstring>#include <cmath>#define MAXN 105using namespace std;int a[MAXN],b[MAXN];int tem[MAXN];int dp[MAXN][MAXN];int path[MAXN];int va[MAXN],vb[MAXN];int main(){ string s; int i,j; while(cin>>s) { if(s=="#") { cout<<"0"<<endl; continue; } int si=1,as=1,bs=1; map<string ,int> M; M[s]=si++; a[as++]=M[s]; while(cin>>s) { if(s=="#") break; if(M[s]==0) { M[s]=si++; } a[as++]=M[s]; } while(cin>>s) { if(s=="#") break; if(M[s]==0) { M[s]=si++; } b[bs++]=M[s]; } int pa=0; memset(dp,0,sizeof(dp)); memset(path,0,sizeof(path)); for(i=1;i<as;i++) { for(j=1;j<bs;j++) { if(a[i]==b[j]) { dp[i][j]=dp[i-1][j-1]+1; } else { dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } } i=as-1;j=bs-1; while(i>0&&j>0)//循环得到路径 { if(dp[i][j]==dp[i-1][j]) i--; else if(dp[i][j]==dp[i][j-1]) j--; else { path[pa++]=a[i]; i--;j--; } } int flag=0; map<string,int>::iterator iter; for(i=pa-1;i>=0;i--) { for(iter=M.begin();iter!=M.end();iter++) { if(iter->second==path[i]) { if(flag) cout<<" "; flag=1; cout<<iter->first; } } } cout<<endl; } return 0;}
0 0
- poj2250
- POJ2250
- poj2250
- poj2250 - Compromise
- 【DP】poj2250
- POJ2250:Compromise(LCS)
- POJ2250 Compromise,map、dp
- POJ2250:Compromise(LCS)
- POJ2250——Compromise
- POJ2250 Compromise(dp)
- POJ2250 Compromise (LCS)
- POJ2250 Compromise (LCS)
- POJ2250(compromise) 解题报告
- poj2250-打印单一LCS路径。
- POJ2250【最长公共子序列】
- poj2250-公共最长子序列
- poj2250 Compromise dp lcs 记录路径
- POJ2250 Compromise DP最长公共子序列
- Calendar类学习,自己写了个日历查询小程序,供大家学习参考
- poj 2387
- hihoCoder 1077 RMQ问题再临-线段树 单点修改,求区间最小值
- fl2440 uda1341声卡驱动移植及madplay播放器移植
- 重新开始
- POJ2250
- 国外程序员整理的Java资源大全
- E_Find The Multiple(POJ_1426)
- Android SD卡多级目录的创建
- 47.Permutations II
- BZOJ 3210 花神的浇花集会
- 类成员函数 后加const和不加const 的区别
- 使用git for windows向coding.net添加本地项目
- 欢迎使用CSDN-markdown编辑器