2 solutions
-
2
#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
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!!!
另附:
- 1
Information
- ID
- 782
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- # Submissions
- 37
- Accepted
- 15
- Uploaded By