资源限制
时间限制:1.0s 内存限制:256.0MB
简介
这样的题放在决赛...确实是送分了。数据量太小,各种方法可AC,也属于入门级的DP。所以此题解采用dp解法。
dp[k]表示以t的下标为k的字母结尾的最长序列。从头开始遍历s字符串,k表示t[k]的下标i为是s[i]的下标。当向前遍历时,若有s[i]=t[k]。则dp[k]=max(dp[k],dp[k-1]+1)。即以下标为k结尾的子数列的长度取二者更大的。最终通过 max_element函数找到最大dp数组中最大元素的下标,输出对应下标的值便可。
Code
#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
int dp[N],k;//dp[i]表示以下标为i结尾的最长字串
string s, t;
int main(){
getline(cin,s);
getline(cin, t);
for (int i = 0; i < s.size(); i++) {//遍历s
if (s[i] == t[k]) {//遇到和t相同的
dp[k] = max(dp[k], dp[k - 1] + 1);//更新
k++;//继续向后查找
}
}
int idx = max_element(dp, dp + t.size()) - dp;//max_element返回的是地址。减去首元素地址便得到下标
printf("%d", dp[idx]);//轻松完结
return 0;
}