hdu 1159(DP+字符串最长公共序列)

http://blog.csdn.net/a_eagle/article/details/7213236

公共序列可以用一个二维数组dp[i][j]保存每个点时的最大数字,本质就是一个双向比较。

dp[i][j] = dp[i-1][j-1]+1;(a[i]==b[j])

dp[i][j] = max(dp[i][j-1],dp[i-1][j]);(a[i]!=b[j])

处理字符串时可以用sf("%s",a+1)来将字符串从1开始保存,这时strlen()也要用a+1

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
using namespace std;

#define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define debug printf("!\n")
#define INF 10000
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long

int n,m,V;
int dp[1010][1010],map[1010][1010];

char a[1010],b[1010];

int main()
{
          int i,j,t;
          while(~sf("%s%s",a+1,b+1))
          {
                    mem(dp,0);
                    mem(map,0);
                    n = strlen(a+1);
                    m = strlen(b+1);
                    for(i=1;i<=n;i++)
                    {
                              for(j=1;j<=m;j++)
                              {
                                        if(a[i]==b[j])
                                        {
                                                  dp[i][j] = dp[i-1][j-1]+1;
                                        }
                                        else
                                        {
                                                  dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
                                        }
                              }
                    }
                    pf("%d\n",dp[n][m]);

          }
}
时间: 2024-10-15 16:17:18

hdu 1159(DP+字符串最长公共序列)的相关文章

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

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

#include<bits/stdc++.h> using namespace std; int dp[1024][1024]; int main() { int i,j; char s1[1024],s2[1024]; while(~scanf("%s %s",s1,s2)) { memset(dp,0,sizeof(dp)); int len1=strlen(s1); int len2=strlen(s2); for(i=0;i<len1;i++) { for(j

hdu 1159 Common Subsequence(最长公共子序列 动态规划)

Common Subsequence Problem Description A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = <x1, x2, ..., xm> another sequence Z = <z1, z2, ..., zk> is a subsequence of X if

HDU 1513 Palindrome(最长公共子序列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 解题报告:给定一个长度为n的字符串,在这个字符串中插入最少的字符使得这个字符串成为回文串,求这个最少的个数是多少? 一开始以为只是一个普通的DP题,但是按照我的想法敲出来之后怎么样都W了,无奈搜了解题报告,得知其实这个就是一个最长公共子序列问题,就是求这个字符串跟它的逆序的 字符串的最长公共子序列.因为杭电的题内存都要求在32M内存以内,所以很开心的敲出来才发现10^6的数组都开不了,所以只好

求两个字符串最长公共子串

一.问题描述: 最长公共子串 (LCS-Longest Common Substring) LCS问题就是求两个字符串最长公共子串的问题.比如输入两个字符串"ilovechina"和“chinabest”的最长公共字符串有"china",它们的长度是5. 二.解法 解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0.然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的位置.如下图: i   l   o  v  e  

两个字符串最长公共子串的问题

算法的基本思想: 当字符匹配的时候,不是简单的给相应元素赋上1,而是赋上其左上角元素的值加一. 我们用两个标记变量来标记矩阵中值最大的元素的位置,在矩阵生成的过程中来判断 当前生成的元素的值是不是最大的,据此来改变标记变量的值,那么到矩阵完成的时 候,最长匹配子串的位置和长度就已经出来了.===========================================================================程序:#include<string.h> #define

求两个字符串最长公共子串(动态规划)

code如下: //Longest common sequence, dynamic programming method void FindLCS(char *str1, char *str2) { if(str1 == NULL || str2 == NULL) return; int length1 = strlen(str1)+1; int length2 = strlen(str2)+1; int **csLength,**direction;//two arrays to recor

(hdu step 3.2.2)Common Subsequence(简单dp:求最长公共子序列的长度)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 976 Accepted Submission(s): 538   Probl