zoukankan      html  css  js  c++  java
  • 【C/C++】最长公共子序列(LCS)/动态规划

    晴神这个的最巧妙之处,在于用dp[i][0] = dp[0][j] = 0的边界条件
    这样从1的下标开始填数组的时候,递推公式dp[i-1][j-1]之类的不会报错

    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int main() 
    {
       string str1, str2;
       cin >> str1 >> str2;
       int len1 = str1.length(); //i
       int len2 = str2.length(); //j
       vector<vector<int>> dp;
       //根据长度开创一个动态二维数组
    
       //vector的初始化,先全部置零
       vector<int> tmp;
       tmp.insert(tmp.begin(), len2 + 1, 0);
       dp.insert(dp.begin(), len1 + 1, tmp);
    
       //填写第一个
       if (str1[0] == str2[0])
       {
          dp[0][0] = 1;
       }
    
       //写状态转移方程
       for (int i = 1; i < len1 + 1; i++)
       {
          for (int j = 1; j < len2 + 1; j++)
          {
             if(str1[i-1] == str2[j-1])
             {
                dp[i][j] = dp[i-1][j-1] + 1;
             }
             else
             {
                dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
             }
             
          }
       }
    
       cout << dp[len1][len2] << endl; //数组下标从0开始,直接输出相当于+1了。
    
       system("pause");
    }
    
    
  • 相关阅读:
    欧拉定理证明&阶乘的逆元
    Tree POJ
    GCD
    java42
    java41
    java
    java40
    搭建两个网站的琐碎问题
    虚拟机从无到有,服务器从无到有的历程(在更)
    java39
  • 原文地址:https://www.cnblogs.com/kinologic/p/14542257.html
Copyright © 2011-2022 走看看