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&