最长公共子序列/子串

思路:动态规划
创建二维数组标记结果
注意边界

子序列

#include
#include
using namespace std;
const int maxn=1000;
int dp[maxn][maxn];
int maxsubsequence(string s1,string s2){
    int m=s1.size();
    int n=s2.size();
    for(int i=0;i<=m;i++){
        for(int j=0;j<=n;j++){
            if(i==0||j==0){
                dp[i][j]=0; //边界为0
                continue;
            }
            if(s1[i-1]==s2[j-1]){
                dp[i][j]=dp[i-1][j-1]+1;//如果s1[i-1]==s2[j-1] 
            }else{
                dp[i][j]=max(dp[i][j-1],dp[i-1][j]);//不等于
            }
        }
    }
    return dp[m][n];
}
int main(){
    string s1,s2;
    cin>>s1>>s2;
    cout<<maxsubsequence(s1,s2);
}

你可能感兴趣的:(动态规划,算法)