AT5213 [ABC141E] Who Says a Pun? 题解
哎,dalao 们都写二分和哈希,我都不会啊~
思路:
动态规划。
看到此题其实也不是没啥想法。想了一下,是“最长公共连续子序列问题”。
设 \(f_{i,j}\) 为已 \(a_i\) 结尾与已 \(b_j\) 结尾的最长公共连续子序列。
由于是“连续”的,所以易得:当 \(a_i = b_j\) 时 \(f_{i,j}=f_{i-1,j-1}+1\)。
又由于两个串互相不重叠,所以只需要 \(a_i\) 一个串进入动态规划就好了,判断过程中还需判断 \(f_{i-1,j-1} < i-j\) 因为当 \(f_{i-1,j-1} \ge i-j\)时就重合了(这一区间的连续子序列都比这一区间大了,肯定重合了呀,自己想想吧,\(f_{i,j}\) 为已 \(a_i\) 结尾与已 \(b_j\) 结尾的最长公共连续子序列)。
CODE:
#include<iostream>
using namespace std;
const int N=5001;
char a[N];
int n;
int f[N][N],maxn=0;
int main(){
cin>>n;
cin>>a+1;
for(int i=1;i<=n-1;i++)
{
for(int j=i+1;j<=n;j++)
{
if(a[i]==a[j]&&f[i-1][j-1]<j-i)
f[i][j]=f[i-1][j-1]+1;
maxn=max(f[i][j],maxn);
}
}
cout<<maxn<<'\n';
return 0;
}

浙公网安备 33010602011771号