动态规划之——最长公共子序列(nyoj36)
生活随笔
收集整理的這篇文章主要介紹了
动态规划之——最长公共子序列(nyoj36)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
問題描述:
最長(zhǎng)公共子序列
時(shí)間限制:3000?ms ?|? 內(nèi)存限制:65535?KB 難度:3 描述tip:最長(zhǎng)公共子序列也稱作最長(zhǎng)公共子串(不要求連續(xù)),英文縮寫為L(zhǎng)CS(Longest Common Subsequence)。其定義是,一個(gè)序列 S ,如果分別是兩個(gè)或多個(gè)已知序列的子序列,且是所有符合此條件序列中最長(zhǎng)的,則 S 稱為已知序列的最長(zhǎng)公共子序列。 輸入
接下來每組數(shù)據(jù)兩行,分別為待測(cè)的兩組字符串。每個(gè)字符串長(zhǎng)度不大于1000.
分析:此題兩個(gè)字符串求最長(zhǎng)公共子序列,兩個(gè)字符串我們就自然的想到用二維數(shù)組來記憶每個(gè)階段的結(jié)果。
動(dòng)態(tài)方程為:if(a[i]==b[j]) dp[i][j] = dp[i-1][j-1]+1;
? ? ?else dp[i][j] = dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];
如圖:
源程序:
#include <stdio.h> #include <string.h> int dp[1005][1005]={0}; int main() {int t;scanf("%d", &t);while(t--){getchar();char a[1005]={0},b[1005]={0};scanf("%s%s", a+1,b+1);int la = strlen(a+1);int lb = strlen(b+1);for(int i=1; i<=la; i++){for(int j=1; j<=lb; j++)if(a[i]==b[j]) dp[i][j] = dp[i-1][j-1]+1;else dp[i][j] = dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];}printf("%d\n", dp[la][lb]);}return 0; }
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的动态规划之——最长公共子序列(nyoj36)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乔新亮:以赢为终,三个月打造一支硬核IT
- 下一篇: CTO丢给我中台总结:阿里的“数据+业务