[动态规划]最长公共子序列
生活随笔
收集整理的這篇文章主要介紹了
[动态规划]最长公共子序列
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
動態(tài)規(guī)劃的本質(zhì)
動態(tài)規(guī)劃的實質(zhì)就是:記憶化搜索。
對于要用動態(tài)規(guī)劃進行解決的問題的特點:
再來看一個問題: 最長公共子序列 POJ1458
給出兩個字符串,求出這樣的一個最長的公共子序列的長度。
思路:MaxLen(i,j) 表示s1的左邊i個字符形成的子串,與s2左邊的j個字符形成的子串的最長公共子序列的長度。
MaxLen(i, j) 就是本題的“狀態(tài)”,定義一數(shù)組。
題目就是要求MaxLen(strlen(str1),strlen(str2))
代碼:
#include <iostream> #include<string.h>char str1[1000]; char str2[1000]; int MaxStrLen[1000][1000];int max(int a, int b) {if (a > b)return a;elsereturn b; }int main() {while (cin >> str1 >> str2) {int strLen1 = strlen(str1);int strLen2 = strlen(str2);int tmp;int i, j;for (i = 0; i < strLen1; i++)MaxStrLen[i][0] = 0;for (j = 0; j < strLen2; j++)MaxStrLen[0][j] = 0;for (int i = 1; i <= strLen1; i++) {for (int j = 1; j <= strLen2; j++) {if (str1[i - 1] == str2[j - 1])MaxStrLen[i][j] = MaxStrLen[i - 1][j - 1] + 1;else {MaxStrLen[i][j] = max(MaxStrLen[i][j - 1], MaxStrLen[i - 1][j]);}}}cout << MaxStrLen[strLen1][strLen2] << endl;} }總結(jié)
以上是生活随笔為你收集整理的[动态规划]最长公共子序列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CF924C Riverside Cur
- 下一篇: Unity DOTS入门教程(Unity