2 solutions

  • 2
    @ 2024-4-6 20:51:01
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    using namespace std;
    #define M 1000
    string s1, s2;
    int f[M][M], len1, len2;
    int main() {
    	while(cin >> s1 >> s2) {
    		memset(f, 0, sizeof(f));
    		len1 = s1.size(), len2 = s2.size();
    		for(int i = 1; i <= len1; i++) {
    			for(int j = 1; j <= len2; j++) {
    				if(s1[i-1] == s2[j-1]) f[i][j] = max(f[i][j], f[i-1][j-1]+1);
    				else f[i][j] = max(f[i-1][j], f[i][j-1]);
    			}
    		}
    		printf("%d\n", f[len1][len2]);
    		s1.clear(), s2.clear();
    	}
    	return 0;
    }
    
    
    • 2
      @ 2024-4-6 18:12:01

      A1297 公共子序列

      一看题目,就知道要算最长公共子序列(LCS),所以这题简直就是A1476的微调去尾版

      不多废话,以下为代码(注释都是照搬A1476,只改了一点小地方):

      #include<bits/stdc++.h>
      using namespace std;
      int dp[4016][4016];//dp数组,dp[a][b]表示第一个序列的第一~第a个数组成的子序列与第二个序列的第一——第b个数组成的子序列的LCS长度(怎么感觉语法有点绕?)
      string s,t;
      int main(){
      	while(cin>>s>>t){//不断输入 
      			int n=s.length();//长度
      		int m=t.length();
      		dp[0][0]=0;//当两个字符串长度均为0时,不用说,LCS肯定为0
      		for(int i=1;i<=n;i++){
      				for(int j=1;j<=m;j++){
      					if(s[i-1]==t[j-1]){//这里可以省去将字符串整体后移一位这一步
      					dp[i][j]=dp[i-1][j-1]+1;//若相同,则LCS长度+1
      				}
      				else{
      					dp[i][j]=max(dp[i-1][j],dp[i][j-1]);//自己靠不住了,找个大的连上
      				}
      			}
      		}
      	cout<<dp[n][m]<<endl;
      	}
      	return 0;
      }
      

      排版有点乱,望谅解,记得点赞o( ̄▽ ̄)d!!!

      另附:

      A1476详细题解(校外) A1476详细题解(校内)

      • 1

      Information

      ID
      782
      Time
      1000ms
      Memory
      256MiB
      Difficulty
      5
      Tags
      # Submissions
      37
      Accepted
      15
      Uploaded By