HDU 1503 Advanced Fruits (LCS,DP)

题意:给你两字符串s1,s2,用最短的字符串表示他们(公共字串输出一次)。

Sample Input

apple peach
ananas banana
pear peach

Sample Output

appleach
bananas
pearch

dp[i][j] : 第一个字符串的前 i 个 ,和第二个字符串的前 j 个最短组合的长度 。

pre[i][j] : 第一个字符串的第 i 个 ,和第二个字符串的第 j 个字符的状态。

#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<map>
#include<cmath>
#include<iostream>
#include <queue>
#include <stack>
#include<algorithm>
#include<set>
using namespace std;
#define INF 1e8
#define eps 1e-8
#define LL long long
#define N 105
#define mod  1000000007
char a[N],b[N],str[N];
int c[N][N],pre[N][N],m,n;
void lcs(char *a,char *b,int c[][N])
{
	int i,j;
	for(i=0;i<=m;i++)
		c[i][0]=i,pre[i][0]=3;
	for(j=0;j<=n;j++)
		c[0][j]=j,pre[0][j]=1;
	for(i=1;i<=m;i++)
	{
		for(j=1;j<=n;j++)
		{
			if(a[i-1]==b[j-1]) c[i][j]=c[i-1][j-1]+1,pre[i][j]=2;  //表示pre[i][j]由a[i-1]或b[i-1]而来
			else if(c[i-1][j]>=c[i][j-1]) c[i][j]=c[i][j-1]+1,pre[i][j]=1;  //pre[i][j]由b[j-1]而来
			else c[i][j]=c[i-1][j]+1,pre[i][j]=3;  //pre[i][j]由a[i-1]而来
		}
	}  

}
void out(int i,int j)
{
	if(i==0&&j==0) return;
	if(pre[i][j]==2)
	{
		out(i-1,j-1);
		printf("%c",a[i-1]);
	}
	else if(pre[i][j]==3)
	{
		out(i-1,j);
		printf("%c",a[i-1]);
	}
	else
	{
		out(i,j-1);
		printf("%c",b[j-1]);
	}
}
int main()
{
	while(~scanf("%s%s",a,b))
	{
		m=strlen(a);n=strlen(b);
		lcs(a,b,c);
		out(m,n);
		printf("\n");
	}
	return 0;
} 

HDU 1503 Advanced Fruits (LCS,DP),布布扣,bubuko.com

时间: 2024-11-25 08:20:29

HDU 1503 Advanced Fruits (LCS,DP)的相关文章

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

UVa 674 &amp; hdu 2069 Coin Change (母函数,dp)

链接:uva 674 题意:有5中货币,价值分别为 50-cent, 25-cent, 10-cent, 5-cent,1-cent,数量都为无限个, 给定一个数 n,求用上述货币组成价值为 n 的方法有多少? 分析:因为n<=7489,可以用 母函数 或 dp 打表 对于dp状态方程为: dp[j]+=dp[j-c[i]] 母函数: #include<stdio.h> int c1[7500],c2[7500],w[5]={1,5,10,25,50};; void mhs() { in

hdu 1503 Advanced Fruits(DP)

题意: 将两个英文单词进行合并.[最长公共子串只要保留一份] 输出合并后的英文单词. 思路: 求最长公共子串. 记录路径: mark[i][j]=-1:从mark[i-1][j]转移而来. mark[i][j]=0:从mark[i-1][j-1]转移而来. mark[i][j]=1:从mark[i][j-1]转移而来. 代码: char s1[105], s2[105]; int dp[105][105]; int mark[105][105]; void print(int x,int y){

HDU 4336 Card Collector(动态规划-概率DP)

Card Collector Problem Description In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, for example, if you collect all the 108 people in the famous novel Water Margin, you will win an amazing award. As a

hdu 4722 Good Numbers(初涉数位dp)

http://acm.hdu.edu.cn/showproblem.php?pid=4722 大致题意:若一个整数的各位数字之和是10的倍数,称这个数为"good number".给出区间[A,B],求出该区间内"good number"的数的个数. 第一道数位dp,折腾了半天才明白怎么回事. 设dp[site][mod]表示到第site位(由高位向低位)前面各位数字之和对10取余为mod的数的个数,进行记忆化搜索.有两个很重要的点,首先是变量up,表示是否到达边界

hdu 2544 最短路 (dijkstra,floyd)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找到两点间最短的距离值. 代码一:(dijkstra算法) 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int n,Min,node[105],visit[105],map[105][105]; 5 void set() 6 { 7 for (int i=1; i<=n; i

UVA 1393 Highways,UVA 12075 Counting Triangles —— (组合数,dp)

先看第一题,有n*m个点,求在这些点中,有多少条直线,经过了至少两点,且不是水平的也不是竖直的. 分析:由于对称性,我们只要求一个方向的线即可.该题分成两个过程,第一个过程是求出n*m的矩形中,dp[i][j]代表在这个矩形中终点是到(i,j)这个点的满足题意的直线条数,那么,用dp的话就可以得出递推关系:由长和宽分别小1的左右两个矩形中满足题意的线的条数减去他们共有的矩形中满足的线的条数(容斥减去重复部分),之后还要判断从最左上角的点(1,1)到(i,j)是否可以组成一条线,这个条件是gcd(

HDU 1503 Advanced Fruits (LCS,最长公共子串,变形)

题意:给两个水果名,要求他们的LCS部分只输出1次,其他照常输出,但是必须保持原来的顺序! 思路:求LCS是常规的,但是输出麻烦了,要先求LCS,再标记两串中的所有LCS字符,在遇到LCS字符时,先输串1的,再输串2的,然后输该字符,以保证每个LCS字符输出前,两串中该字符前面的字符全部已输出. 1 //#pragma comment(linker,"/STACK:102400000,102400000") 2 #include <iostream> 3 #include

HDU 1503 Advanced Fruits[ LCS ]

题目:HDU 1503 思路:先求出最长公共子序列,记录路径.后进行拼接. 代码 #include<cstdio> #include<cstring> #include<cstring> #include<vector> #include<iostream> #include<algorithm> #define mod 1000000007 using namespace std; typedef long long LL; int