记录路径的最长公共子序列。。
简单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;
}
}
分享到:
相关推荐
LMS Longest Monotonically Increasing Sequence Algorithm
这个问题是关于动态规划(Dynamic Programming, DP)的一个经典实例,被称作“POJ滑雪问题”。在编程竞赛网站POJ(Problem...这种问题解决技巧在处理类似的最优化问题时非常有用,如最长公共子序列、最长递增子序列等。
包括最长公共子序列、最优二分检索树等问题,关键在于状态转移方程的设计。 ### 六、数学 #### 组合数学 涵盖加法原理、乘法原理、排列组合等,用于解决计数问题,如poj3252。 #### 数论 涉及素数检测、整除性、...
查看“最长公共子序列”的代码,可以了解动态规划的应用;研究“二分查找”的实现,可以掌握二分法的精髓。此外,这些代码通常会遵循一定的编码规范,有助于提升编程风格和代码质量。 总的来说,这个资源对于想要...
动态规划则常用于解决背包问题、最长公共子序列等复杂问题;贪心算法常常用于解决最优调度、最小花费等问题;排序算法如快速排序、归并排序等也是常考内容;搜索算法如深度优先搜索、广度优先搜索和A*搜索等在解决...
动态规划适用于那些具有重叠子问题和最优子结构的优化问题,如背包问题、最长公共子序列、斐波那契数列等。 在北大POJ初级阶段,动态规划的题目可能涵盖基础的最短路径问题、最长递增子序列、矩阵链乘法、剪枝操作...
在对齐问题中,可能需要找出两个字符串之间的最长公共子序列或最长公共子串,这是字符串处理中的经典问题。 4. **贪心算法**:另一种可能的解决方案是贪心策略,通过每次做出局部最优选择,期望得到全局最优解。...
动态规划题目通常要求求解最优解,例如背包问题、最长公共子序列等问题。例如,题目poj3267和poj1836就属于动态规划问题,其中poj1836需要通过动态规划找到最优的编辑距离。 ### 5. 数学算法 数学算法涵盖代数、...
在编程竞赛中,动态规划通常被用来解决如背包问题、最长公共子序列、最短路径等问题。 对于POJ 1170的具体问题,由于没有给出详细描述,我们可以进行一般性的动态规划知识讲解。动态规划问题通常分为以下几步: 1....
6. 1458 Common Subsequence:寻找两个字符串的最长公共子序列,经典动态规划问题。 7. 1953 World Cup Noise:可能需要计算某种状态的最大可能性。 其次,模拟题通常是指通过精确复制问题的逻辑来求解的题目,这类...
- "动态规划"常常用于解决背包问题、最长公共子序列等复杂问题。 - "贪心策略"通常用于求解局部最优解的问题,如霍夫曼编码、活动安排等。 - "字符串处理"可能包括模式匹配、字符串操作等。 - "数论"可能涉及到素数...
4. **动态规划**:用于解决最优化问题,如背包问题、最长公共子序列、最小编辑距离等,它通过构建状态转移方程来找到最优解。 5. **贪心算法**:对于一些局部最优的选择可以导致全局最优解的问题,如霍夫曼编码、...
在实际应用中,动态规划可以用于解决各种问题,如背包问题、最长公共子序列、最短路径等。在编程竞赛中,动态规划问题是常见的挑战类型,它测试参赛者的逻辑思维能力、问题分解技巧以及高效算法实现。 在提供的文件...
* 1458 Common Subsequence:本题目使用动态规划来计算两个序列的最长公共子序列。 * 1579 Function Run Fun:本题目使用动态规划来计算函数的执行次数。 * 1887 Testing the CATCHER:本题目使用动态规划来计算测试...
许多POJ题目可以通过动态规划来解决,如背包问题、最长公共子序列、矩阵链乘等。 4. **贪心算法**:贪心算法是一种局部最优策略,通过每一步选择当前最优解,期望最终得到全局最优解。例如,霍夫曼编码、活动安排...
4. **动态规划**:DP是一种强大的工具,能解决许多复杂的问题,如背包问题、最长公共子序列、矩阵链乘法等,通过状态转移方程求解最优解。 5. **回溯算法**:用于解决组合问题和约束满足问题,如八皇后问题、数独...
3. **动态规划**:背包问题、最长公共子序列、最短路径问题等。 4. **递推与回溯**:斐波那契数列、八皇后问题、深度优先搜索等。 5. **字符串处理**:模式匹配、KMP算法、Manacher's Algorithm等。 6. **数学...
1. 动态规划(Dynamic Programming, DP):如背包问题、最长公共子序列、最短路径等。 2. 图论(Graph Theory):包括最小生成树、最短路径算法(Dijkstra、Floyd-Warshall等)、拓扑排序等。 3. 排序与搜索...
3. **动态规划**:解决最优子结构和重叠子问题的策略,如背包问题、最长公共子序列、矩阵链乘法等。 4. **字符串处理**:如KMP算法、Manacher's Algorithm、Z-Algorithm用于查找模式匹配,Rabin-Karp或Boyer-Moore...
3. 动态规划:许多POJ题目可以通过动态规划求解,如背包问题、最长公共子序列、最短路径等。 4. 图论算法:包括Dijkstra算法、Floyd算法、Prim算法等,用于解决图的遍历和最短路径问题。 5. 贪心算法:在每一步选择...