POJ 2250
2015-06-10 17:13
288 查看
#include <iostream> #include <stack> #define MAXN 150 #include <string> using namespace std; int dp[MAXN][MAXN]; int mark[MAXN][MAXN]; string s_1[MAXN]; string s_2[MAXN]; stack <string> coll; int main() { int i; int j; string tem; int n_1; int n_2; //freopen("acm.acm","r",stdin); while(cin>>tem) { s_1[0] = tem; i = 1; while(cin>>tem) { if(tem == "#") { break; } s_1[i ++] = tem; } n_1 = i; i = 0; while(cin>>tem) { if(tem == "#") { break; } s_2[i ++] = tem; } n_2 = i; dp[0][0] = 0; for(i = 0; i <= n_1; ++ i) { dp[i][1] = 0; } for(i = 0; i <= n_2; ++ i) { dp[1][i] = 0; } memset(mark,-1,sizeof(mark)); for(i = 0; i < n_1; ++ i) { for(j = 0; j < n_2; ++ j) { if(s_1[i] == s_2[j]) { dp[i+1][j+1] = dp[i][j] + 1; mark[i][j] = 1; //相等来自i-1和j-1 } else { if(dp[i+1][j] > dp[i][j+1]) { dp[i+1][j+1] = dp[i+1][j]; mark[i][j] = 2; // j-1方向 } else { dp[i+1][j+1] = dp[i][j+1]; mark[i][j] = 3; // i-1方向 } } } } i = n_1-1; j = n_2-1; while(mark[i][j] != -1 && j >= 0 && i >= 0) { if(mark[i][j] == 1) { coll.push(s_1[i]); -- i; -- j; } else if(mark[i][j] == 2) { -- j; } else if(mark[i][j] == 3) { -- i; } } while(!coll.empty()) { cout<<coll.top()<<" "; coll.pop(); } cout<<endl; } }
相关文章推荐
- SQLServer学习笔记系列8
- 用iptables 实现本地端口转发(不错)
- 软件开发流程之Scrum/Sprint开发方法
- linux系统优化项
- iOS获得截屏效果
- 字符串的排列
- android shape的使用
- Java可重入锁
- POJ 2245
- POJ 2247
- shell脚本积累
- freetype日记1
- web开发----jsp中通用模版的动态引用其它页面
- PHP中的一些常用函数
- Core Data的基本知识(增删查改) --以及实际项目中学习
- Android缓存Cache学习
- web开发----jsp中通用模版的动态引用其它页面
- 并行计算复习————第四篇 并行计算软件支撑:并行编程
- android模拟器滑动界面时,自动输出'C'的问题
- HTML5漂亮实用的电子书