nyoj 36 最长公共子序列 【DP】

今天听了老师讲的最长公共子序列,就拿以前做过的题又做了一遍。。。

我用的是最简单普通的方法,

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[1005][1005];
int main()
{
	char a[1005], b[1005];
	int t;
	scanf("%d", &t);
	while(t --){
		scanf("%s", a);
		scanf("%s", b);
		int la = strlen(a);
		int lb = strlen(b);
		memset(dp, 0, sizeof(dp));
		int i, j;
	//	printf("%d %d\n", la, lb);
		for(i = 1; i <= la; i ++){
			for(j = 1; j <= lb; j ++){
				if(a[i-1] == b[j-1]) dp[i][j] = dp[i-1][j-1]+1;
				else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);//printf("%d..", dp[i][j]);
			}
		//	putchar('\n');
		}
		printf("%d\n", dp[la][lb]);
	}
	return 0;
} 

下面的一种优化空间的解法(可以没弄懂。。。回头再看)

代码:

#include <stdio.h>
#include <string.h>
char s1[1001], s2[1001];
int dp[1001], t, old, tmp;
int main(){
    scanf("%d", &t);
    getchar();
    while(t--){
        gets(s1);
        gets(s2);
        memset(dp, 0, sizeof(dp));
        int lenS1=strlen(s1), lenS2=strlen(s2);
        for(int i=0; i<lenS1; i++){ //
            old=0;
            //若s1[i]==s2[j], dp[i][j] = dp[i-1][j-1]+1
            //否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1])
            //此处进行了空间优化,old 代表 dp[i-1][j-1]
            //dp[j-1] 代表 dp[i][j-1], dp[j] 代表 dp[i-1][j]
            for(int j=0; j<lenS2; j++){
                tmp = dp[j];      //这就不懂了。。
                if(s1[i]==s2[j])
                    dp[j] = old+1;
                else
                    if(dp[j-1]>dp[j])dp[j]=dp[j-1];
                old = tmp;
            }
        }
        printf("%d\n", dp[lenS2-1]);
    }
    return 0;
}        

nyoj 36 最长公共子序列 【DP】

时间: 2024-10-24 07:55:22

nyoj 36 最长公共子序列 【DP】的相关文章

NYOJ 36 最长公共子序列 (还是dp)

这个好多算法书上都有,不仅限于<算法导论> 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 咱们就不拐弯抹角了,如题.须要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence). 其定义是.一个序列 S ,假设各自是两个或多个已知序列的子序列,且是全部符合此条件序列中最长的.则 S 称为已知序列的最长公共子序列. 输入 第一行给出一个整数N(0

nyist oj 36 最长公共子序列 (动态规划基础题)

最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 输入 第一行给出一个整数N(0<N<100)表示待测数据组数 接

hdu 1159 Common Subsequence(最长公共子序列 DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25416    Accepted Submission(s): 11276 Problem Description A subsequence of

hdu 1159 common sequence (最长公共子序列 dp)

http://acm.hdu.edu.cn/showproblem.php?pid=1159 题意 : 给出两个字符串 求出最长公共子序列 思路: if(str1[i]==str2[j]) { dp[i][j]=max(dp[i-1][j-1]+1,max(dp[i-1][j],dp[i][j-1])); } else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); #include<cstdio> #include<cstring> #include&l

lcs(最长公共子序列),dp

lcs(最长公共子序列) 求两个序列的lcs的长度,子序列可不连续 dp[i][j]=dp[i-1][j-1]+1(a[i]==b[i]) dp[i][j]=max(dp[i-1][j],dp[i][j-1])(a[i]!=b[i]) memset(dp,0,sizeof(dp)); for(int i=1;i<=n1;i++){ for(int j=1;j<=n2;j++){ if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(

最长公共子序列 DP

算法老师的作业,一道dp基础题,给你两个序列,问你最长公共子序列是什么,比如:(a,b)是(a,c,d,b)的子序列.注意不是最长公共子串,这里的子序列可以不连续. 两个for循环就出来了,每一个dp[i][j]可以从dp[i-1][j-1].dp[i-1][j].dp[i][j-1]三种情况更新过来,取个最大的,然后把路径用123存下来,最后再顺着路径找然后逆序输出就行. sample input: 7 4 A B C B D A B B C D B 7 6 A B C B D A B B D

bzoj3304[Shoi2005]带限制的最长公共子序列 DP

题意:给出三个序列,求出前两个的公共子序列,且包含第三个序列,要求长度最长. 这道题目怎么做呢,f[i][j]表示a串1-i,b串1-j的最长,g[i][j]表示a串i-n,b串j-m最长, 那么只需要判断中间有没有包好c串就OK了,这样都是O(n^2)的. #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<queue> #include&l

求最长公共子序列-DP问题

Longest common subsequence problem The longest common subsequence (LCS) problem is the problem of finding the longest subsequence common to all sequences in a set of sequences (often just two sequences). It differs from the longest common substring p

NYOJ 36 LCS(最长公共子序列)

题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=36 最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条