动态规划之——最长公共子序列(nyoj36)
生活随笔
收集整理的這篇文章主要介紹了
动态规划之——最长公共子序列(nyoj36)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述:
最長公共子序列
時間限制:3000?ms ?|? 內存限制:65535?KB 難度:3 描述tip:最長公共子序列也稱作最長公共子串(不要求連續),英文縮寫為LCS(Longest Common Subsequence)。其定義是,一個序列 S ,如果分別是兩個或多個已知序列的子序列,且是所有符合此條件序列中最長的,則 S 稱為已知序列的最長公共子序列。 輸入
接下來每組數據兩行,分別為待測的兩組字符串。每個字符串長度不大于1000.
分析:此題兩個字符串求最長公共子序列,兩個字符串我們就自然的想到用二維數組來記憶每個階段的結果。
動態方程為: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位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的动态规划之——最长公共子序列(nyoj36)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乔新亮:以赢为终,三个月打造一支硬核IT
- 下一篇: CTO丢给我中台总结:阿里的“数据+业务