1. 程式人生 > >hdu1159(最長公共子序列,滾動陣列)

hdu1159(最長公共子序列,滾動陣列)

狀態轉移方程為:dp[i][j]=dp[i-1][j-1]+1(s1[i]==s2[j]);dp[i][j]=max(dp[i-1][j],dp[i][j-1])(s1[i]!=s2[j])

此題字串的長度不是很大,所以不會超記憶體

程式碼如下:

#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>

#define eps 1e-9
#define N 1000  
#define P system("pause")
using namespace std;
char s1[N],s2[N];
int dp[N][N];

int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);cc
    int i,j;
    while(scanf("%s%s",s1,s2)!=EOF)
    {
          int len1=strlen(s1);
          int len2=strlen(s2);
          memset(dp,0,sizeof(dp));
          for(i=1;i<=len1;i++)
             for(j=1;j<=len2;j++)
             {
                   if(s1[i-1]==s2[j-1])
                       dp[i][j]=dp[i-1][j-1]+1;
                   else
                       dp[i][j]=max(dp[i][j-1],dp[i-1][j]);                    
             }                               
          printf("%d\n",dp[len1][len2]);
    }                         
//    P;                               
    return 0;    
}
擴充套件:

當字串的長度很大時,開二維dp陣列就會超記憶體,所以要用滾動陣列

程式碼如下:

#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>

#define eps 1e-9
#define N 1000  
#define P system("pause")
using namespace std;
char s1[N],s2[N];
int dp[N],pre[N];

int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);cc
    int i,j;
    while(scanf("%s%s",s1,s2)!=EOF)
    {
          int len1=strlen(s1);
          int len2=strlen(s2);
          memset(dp,0,sizeof(dp));
          memset(pre,0,sizeof(pre));
          for(i=1;i<=len1;i++){
             for(j=1;j<=len2;j++)
             {
                   if(s1[i-1]==s2[j-1])
                       dp[j]=pre[j-1]+1;
                   else
                       dp[j]=max(dp[j-1],pre[j]); 
                   pre[j-1]=dp[j-1];     //pre記錄i-1行  dp記錄i行                
             }                 
             pre[len2]=dp[len2];         //不要忘記最後一個字元
          }              
          printf("%d\n",dp[len2]);
    }                         

 //   P;                               
    return 0;    
}


相關推薦

hdu1159公共序列滾動陣列

狀態轉移方程為:dp[i][j]=dp[i-1][j-1]+1(s1[i]==s2[j]);dp[i][j]=max(dp[i-1][j],dp[i][j-1])(s1[i]!=s2[j]) 此題字串的長度不是很大,所以不會超記憶體 程式碼如下: #include<i

hdu1513Palindrome動態規劃之公共序列變形+滾動陣列

2題意: 就是填多少字元使之變成迴文字串;#include<iostream> #include<cstring> #include<queue> #include<cstdio> #include<string.h> #include<al

spoj LCS2多個串的公共序列字尾自動機

A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the set of lowercase letters. Subs

c++學習筆記:動態規劃公共序列01揹包問題金錢兌換問題

/* 參考書:演算法設計技巧與分析 M.H.Alsuwaiyel著 吳偉旭 方世昌譯 ---------------------------------------------------------------- 1.遞迴 將問題分成相似的子問題 1.1Fa

Prince and Princess公共序列優化動態規劃

<a target=_blank href="https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&

HDU 1513 Palindrome:LCS公共序列or 記憶化搜索

ble urn size rom str 個數 blog using reverse 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 題意:   給你一個字符串s,你可以在s中的任意位置添加任意字符,問你將s變成一個回

POJ 1458 - Common Subsequence公共序列 題解

void 方式 mem strong 輸出 inline ron eof init 此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。 題目鏈接:http://poj.org/problem?id=1458 題目大意: 有若幹組數據,每組給出兩個字符

LCS公共序列

rdquo 工作 dna abc sub 動態規劃 != 給定 似的   這個問題很有意思,在生物應用中,經常需要比較兩個(或多個)不同生物體的DNA片段。例如,某種生物的DNA可能為S1 = ACCGGTCGAGTGCGCGGAAGCCGGCCGAA,S2 = GTCGT

小樂樂匹配字串 公共序列

連結:https://ac.nowcoder.com/acm/contest/301/E 來源:牛客網   小樂樂匹配字串 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32768K,其他語言65536K 64bit IO Format: %lld 題目描述

1045 Favorite Color Stripe 30 分公共序列變形

1045 Favorite Color Stripe (30 分) Eva is trying to make her own color stripe out of a given one. She would like to keep only her favorite colors in

10723 公共序列變形

思路:求長度最少的串的思想和求最長公共子串基本一致,dp[i][j]即可。 求數量,則藉助於前面的dp[i][j]。 具體思路看程式碼: #include <cstdio> #include <cstring> #include <algo

學習筆記--NLP文字相似度之LCS公共序列

最長公共子序列 一個序列S任意刪除若干個字元得到的新序列T,則T叫做S的子序列 兩個序列X和Y的公共子序列中,長度最長的那個,定義為X和Y的最長公共子序列  例如:      --字串12455與245576的最長公共子序列為2455      --字串acd

LCS(longest common subsequence)公共序列演算法模板

看了幾分寫的相當好的部落格: 下面內容來轉載自上面文章 問題描述 什麼是最長公共子序列呢?好比一個數列 S,如果分別是兩個或多個已知數列的子序列,且是所有符合此條件序列中最長的,則S 稱為已知序列的最長公共子序列。     舉個例子,如:有兩條

公共序列字串

首先說明子序列和子串的區別 子串是必須連續的(相鄰),是特殊的子序列。 對於一般的LCS問題,都屬於NP問題。當數列的量為一定的時,都可以採用動態規劃去解決。 最直接的解法自然是找出兩個字串的所有子字串進行比較看他們是否相同,然後取得相同最長的那個。對於一個長度為n的字串,它有n(n

PAT 1045. Favorite Color Stripe (30)按一定順序找出序列動態規劃

官網 1045. Favorite Color Stripe (30) Eva is trying to make her own color stripe out of a given one. She would like to keep only h

LCS公共序列問題

例題見挑戰程式設計競賽P56 解釋:子序列是從原序列中按順序(可以跳著)抽取出來的,序列是不連續的,這是其和子串最大的區別; 我們可以定義dp陣列為dp[i][j],表示的是s1-si和t1-ti對應的最長公共子序列長度 狀態轉移方程的話我們分為s[i],t[i]相同和s[i],t[i]不同時的情況

] 找工作知識儲備(2)---陣列字串那些經典演算法:大子序列遞增序列公共公共序列字串編輯距離不重複迴文

作者:寒小陽 時間:2013年9月。 0、前言         這一部分的內容原本是打算在之後的字串或者陣列專題裡面寫的,但看著目前火熱進行的各家網際網路公司筆試面試中,出現了其中的一兩個內容,就隨即將這些經典問題整理整理,單寫一

POJ 1458公共序列

Time Limit: 1000MS Memory Limit: 10000K Description A subsequence of a given sequence is the given sequence with some elemen

HDU 1159:Common Subsequence公共序列

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23108    Accepted Submission(s

HDU 1159 Common Subsequence公共序列

大概題意:給出兩個字串s1,s2,求他們的最長公共子序列長度... 大概算是模板題? #include<cstdio> #include<cstring> #include<algorithm> #include<iostream&