LCS的路径打印

 1 for(int i = 1; i <= m; i ++)
 2         for(int j = 1; j <= n; j ++)
 3             if(!strcmp(a[i], b[j]))
 4                 {
 5                     f[i][j] = f[i-1][j-1] + 1;
 6                     p[i][j] = 1;//赋值
 7                 }
 8             else if(f[i-1][j]>f[i][j-1])
 9                         {
10                             f[i][j] = f[i-1][j];
11                             p[i][j] = 0;//赋值
12                         }
13                         else
14                         {
15                             f[i][j] = f[i][j-1];
16                             p[i][j] = -1;//赋值
17                         }
 1 void print(int i , int j)//输出
 2 {
 3     if(!i || !j)
 4         return ;
 5     if(p[i][j] == 1)
 6     {
 7         print(i-1,j-1);
 8         if(flag)
 9       printf(" ");
10     else
11       flag = 1;
12     printf("%s", a[i]);
13     }
14     else if(p[i][j] == 0)
15                 print(i-1,j);
16                 else print(i,j-1);
17 }
时间: 2024-11-10 17:32:58

LCS的路径打印的相关文章

The Pilots Brothers&#39; refrigerator-DFS路径打印

I - The Pilots Brothers' refrigerator Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description The game "The Pilots Brothers: following the stripy elephant" has a quest where a player needs to op

DAG镶嵌模型+原始路径打印

DP矩形镶嵌,打印路径与最长公共子序列相似. 1 #include<stdio.h> 2 #include<string.h> 3 #define doumax(a,b) (a>b?a:b) 4 const int maxn=100; 5 int mat[maxn][maxn],dp[maxn],n; 6 struct node{ 7 int a; 8 int b; 9 void dousort(void) 10 { 11 if(a<b){ 12 int temp=a;

UVA - 624CD(递推+ 路径打印)

题目: UVA - 624CD(递推+ 路径打印) 题目大意:给出一组数据,给定一个N,问这些数据能否拼凑出不大于N的最接近N的数据,可以的话输出最接近N的数据,并且打印出最长路径(要求要找输入的顺序). 解题思路:dp[j]:代表凑出J这个数值最多需要几个数.d[j] = Max (d[j - v[i]] + 1. 打印路径,如果取得是最小值,那么顺着dp标记的值的减小就可以找到路径,但是取的是最大值,这样它的下一个并不能直接靠dp数组的值来判断,而是要判断到最后是否最终的值等于0.用回溯.

POJ 3984 迷宫问题(简单bfs+路径打印)

传送门: http://poj.org/problem?id=3984 迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33105   Accepted: 18884 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个

hdu 1503 LCS输出路径【dp】

hdu 1503 不知道最后怎么输出,因为公共部分只输出一次.有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左走.我用1表示向上走,2向左上方走,3向左走. 刚开始输入字符串时有两种方法,直接输入:或从地址后一位输入,即此时数组起始编号为1.直接输入时,dp[i][j]表示的是以s1[i-1],s2[j-1]为结尾LCS,另一种则就是表示以s1[i],s2[j]为结尾的LCS.两者在路径输出时有些差别,以前

HDU ACM 1026 Ignatius and the Princess I -&gt; BFS+优先队列+路径打印

分析:在BFS中使用优先队列即可获取最小值. #include<iostream> #include<queue> using namespace std; //BFS+优先队列(打印路径) #define N 101 struct Node //节点 { int x,y,time; friend bool operator<(const Node& a,const Node& b) //有限队列根据时间做依据 { return a.time>b.tim

HDU 1503 Advanced Fruits(LCS+记录路径)

http://acm.hdu.edu.cn/showproblem.php?pid=1503 题意: 给出两个串,现在要确定一个尽量短的串,使得该串的子串包含了题目所给的两个串. 思路: 这道题目就是要我们求LCS,记录好路径就好. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<sstream> 6 #inc

无向图欧拉道路(欧拉回路)的判定与路径打印

欧拉道路描述的是无向图的一个顶点出发的一条道路能够经过每条边恰好一次 欧拉回路指的是任意点出发都满足上述性质 如果一个图是欧拉道路或者欧拉回路,必须满足两个条件 第一个条件,这个图是连通图 第二个条件,所有点的度数满足"一定的关系" 然后我们阐述一下"一定的关系"是什么 检查这个图所有点的度数,求出这个图度数给奇数的点的个数,我们也可以称之为奇点数 如果没有奇点,这个图是一个欧拉回路,从任意点出发可以经过所有的边并回到这个点 如果存在两个奇点(这两个奇点具有这样的性

BFS(最短路+路径打印) POJ 3984 迷宫问题

题目传送门 1 /* 2 BFS:额,这题的数据范围太小了.但是重点是最短路的求法和输出路径的写法. 3 dir数组记录是当前点的上一个点是从哪个方向过来的,搜索+,那么回溯- 4 */ 5 /************************************************ 6 Author :Running_Time 7 Created Time :2015-8-4 9:02:06 8 File Name :POJ_3984.cpp 9 ********************