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;
}

posted @ 2022-03-31 21:39  ㅤSmartBig  阅读(132)  评论(0)    收藏  举报