`
yiheng
  • 浏览: 155460 次
社区版块
存档分类

poj 2250 最长公共子序列

    博客分类:
  • DP
DP 
阅读更多

记录路径的最长公共子序列。。

简单dp,开一个pre数组记录路径,由于 dp[i][j]只能有三种状态推过来,即dp[i-1][j-1],dp[i][j-1],dp[i-1][j],那么我们可以将pre[i][j]分别设为 0  1   2 ,最后只要递归扫一遍就可以了。。

#include<iostream>
#include<sstream>
#include<string>
#include<algorithm>
using namespace std;

const int maxn=105;
string s[2][maxn];
int dp[maxn][maxn];
int pre[maxn][maxn];
int len[2];

void getlcs(){
	for(int i=0;i<len[0];i++){
		dp[i][0]=0;
		for(int j=0;j<len[1];j++){
			dp[0][j]=0;
			if(s[0][i]==s[1][j]){
				dp[i+1][j+1]=dp[i][j]+1;
				pre[i+1][j+1]=0;
			}
			else {
				if(dp[i+1][j]>dp[i][j+1])dp[i+1][j+1]=dp[i+1][j],pre[i+1][j+1]=1;
				else dp[i+1][j+1]=dp[i][j+1],pre[i+1][j+1]=2;
			}
		}
	}
}

void printpre(int len0,int len1){
	if(len0==0||len1==0)return;
	if(pre[len0][len1]==0){
		printpre(len0-1,len1-1);
		if(len0==1)cout<<s[0][len0-1];
		else cout<<" "<<s[0][len0-1];
	}
	else if(pre[len0][len1]==1)printpre(len0,len1-1);
	else printpre(len0-1,len1);
}

int main(){
	string input;
	while(cin>>s[0][0]){
		for(int i=0;i<2;i++){
			int cnt=(i==0?1:0);
			while(1){
				getline(cin,input);
				stringstream sin(input);
				while(sin>>input){
					if(input=="#")goto endinput;
					else s[i][cnt++]=input;
				}
			}
			endinput:;
			len[i]=cnt;	
		}
		getlcs();
		//cout<<dp[len[0]][len[1]]<<endl;
		printpre(len[0],len[1]);
		cout<<endl;
	}
}



分享到:
评论

相关推荐

    最长公共子序列Longest Monotonically Increasing Sequence Algorithm

    LMS Longest Monotonically Increasing Sequence Algorithm

    POJ滑雪问题

    这个问题是关于动态规划(Dynamic Programming, DP)的一个经典实例,被称作“POJ滑雪问题”。在编程竞赛网站POJ(Problem...这种问题解决技巧在处理类似的最优化问题时非常有用,如最长公共子序列、最长递增子序列等。

    poj各种分类

    包括最长公共子序列、最优二分检索树等问题,关键在于状态转移方程的设计。 ### 六、数学 #### 组合数学 涵盖加法原理、乘法原理、排列组合等,用于解决计数问题,如poj3252。 #### 数论 涉及素数检测、整除性、...

    poj的一些题目的代码

    查看“最长公共子序列”的代码,可以了解动态规划的应用;研究“二分查找”的实现,可以掌握二分法的精髓。此外,这些代码通常会遵循一定的编码规范,有助于提升编程风格和代码质量。 总的来说,这个资源对于想要...

    POJ题目及答案

    动态规划则常用于解决背包问题、最长公共子序列等复杂问题;贪心算法常常用于解决最优调度、最小花费等问题;排序算法如快速排序、归并排序等也是常考内容;搜索算法如深度优先搜索、广度优先搜索和A*搜索等在解决...

    北大POJ初级-动态规划

    动态规划适用于那些具有重叠子问题和最优子结构的优化问题,如背包问题、最长公共子序列、斐波那契数列等。 在北大POJ初级阶段,动态规划的题目可能涵盖基础的最短路径问题、最长递增子序列、矩阵链乘法、剪枝操作...

    POJ1836-Alignment

    在对齐问题中,可能需要找出两个字符串之间的最长公共子序列或最长公共子串,这是字符串处理中的经典问题。 4. **贪心算法**:另一种可能的解决方案是贪心策略,通过每次做出局部最优选择,期望得到全局最优解。...

    POJ 分类题目 txt文件

    动态规划题目通常要求求解最优解,例如背包问题、最长公共子序列等问题。例如,题目poj3267和poj1836就属于动态规划问题,其中poj1836需要通过动态规划找到最优的编辑距离。 ### 5. 数学算法 数学算法涵盖代数、...

    POJ-1170.rar_poj

    在编程竞赛中,动态规划通常被用来解决如背包问题、最长公共子序列、最短路径等问题。 对于POJ 1170的具体问题,由于没有给出详细描述,我们可以进行一般性的动态规划知识讲解。动态规划问题通常分为以下几步: 1....

    算法分类以及POJ题目分类

    6. 1458 Common Subsequence:寻找两个字符串的最长公共子序列,经典动态规划问题。 7. 1953 World Cup Noise:可能需要计算某种状态的最大可能性。 其次,模拟题通常是指通过精确复制问题的逻辑来求解的题目,这类...

    POJ部分源代码(151题)

    - "动态规划"常常用于解决背包问题、最长公共子序列等复杂问题。 - "贪心策略"通常用于求解局部最优解的问题,如霍夫曼编码、活动安排等。 - "字符串处理"可能包括模式匹配、字符串操作等。 - "数论"可能涉及到素数...

    北大POJ初级-基本算法

    4. **动态规划**:用于解决最优化问题,如背包问题、最长公共子序列、最小编辑距离等,它通过构建状态转移方程来找到最优解。 5. **贪心算法**:对于一些局部最优的选择可以导致全局最优解的问题,如霍夫曼编码、...

    POJ-2151.rar_poj

    在实际应用中,动态规划可以用于解决各种问题,如背包问题、最长公共子序列、最短路径等。在编程竞赛中,动态规划问题是常见的挑战类型,它测试参赛者的逻辑思维能力、问题分解技巧以及高效算法实现。 在提供的文件...

    POJ各题算法分类和题目推荐 ACM必看

    * 1458 Common Subsequence:本题目使用动态规划来计算两个序列的最长公共子序列。 * 1579 Function Run Fun:本题目使用动态规划来计算函数的执行次数。 * 1887 Testing the CATCHER:本题目使用动态规划来计算测试...

    POJ部分题解

    许多POJ题目可以通过动态规划来解决,如背包问题、最长公共子序列、矩阵链乘等。 4. **贪心算法**:贪心算法是一种局部最优策略,通过每一步选择当前最优解,期望最终得到全局最优解。例如,霍夫曼编码、活动安排...

    本人整理的POJ解题报告大全

    4. **动态规划**:DP是一种强大的工具,能解决许多复杂的问题,如背包问题、最长公共子序列、矩阵链乘法等,通过状态转移方程求解最优解。 5. **回溯算法**:用于解决组合问题和约束满足问题,如八皇后问题、数独...

    西工大c语言poj答案

    3. **动态规划**:背包问题、最长公共子序列、最短路径问题等。 4. **递推与回溯**:斐波那契数列、八皇后问题、深度优先搜索等。 5. **字符串处理**:模式匹配、KMP算法、Manacher's Algorithm等。 6. **数学...

    poj 部分题目源代码(共77题) for acm ,一年所做的

    1. 动态规划(Dynamic Programming, DP):如背包问题、最长公共子序列、最短路径等。 2. 图论(Graph Theory):包括最小生成树、最短路径算法(Dijkstra、Floyd-Warshall等)、拓扑排序等。 3. 排序与搜索...

    poj1005.zip_北大poj1005

    3. **动态规划**:解决最优子结构和重叠子问题的策略,如背包问题、最长公共子序列、矩阵链乘法等。 4. **字符串处理**:如KMP算法、Manacher's Algorithm、Z-Algorithm用于查找模式匹配,Rabin-Karp或Boyer-Moore...

    c++ npu poj答案100道全

    3. 动态规划:许多POJ题目可以通过动态规划求解,如背包问题、最长公共子序列、最短路径等。 4. 图论算法:包括Dijkstra算法、Floyd算法、Prim算法等,用于解决图的遍历和最短路径问题。 5. 贪心算法:在每一步选择...

Global site tag (gtag.js) - Google Analytics