NC 13230.組み合わせ回文構造部分文字列

リンク
の問題の意味:
文字列 \(A \) \(Bは\)パリンドローム配列に結合されている \(C \)に属する、 \(A \) \(B \)の文字 \(C \)一定に維持するために
可能なシークを \(C \)の最大長さ
のアイデア:
間隔DPが
設けられている(F [I] [J \ ] [K] [L] \) の \(\)(\ I \)番目の文字 \(J \)文字や \(B \) \ K(\)の要件を構成することができる場合にパリンドロームl番目の文字を満たす文字列
:転写式
\(F [ I] [J] [K] [L] =(F [I + 1] [J-1] [K] [L] + [I] == A [J])|(F [I + 1] [J] [K] [L -1] + [I] == B [L])|(F [I] [J-1] [K + 1] [L] + [J] == B [K])|(F [
I] [J] [K + 1] [L-1] + B [K] == B [L])\) であれば \(F [I] [J ] [K] [L] \)です\(1 \)回文配列に組み込むことができる説明し、その後、更新\(RES \)
コード:

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef pair<int,int> pii;

const int N=60;
char a[N],b[N];
int f[N][N][N][N];
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;cin>>T;
    while(T--) {
    	cin>>a+1;
    	cin>>b+1;
    	int len_a=strlen(a+1),len_b=strlen(b+1);
    	int res=1;
    	for(int len1=0;len1<=len_a;len1++)
            for(int len2=0;len2<=len_b;len2++)
    	        for(int i=1;i+len1-1<=len_a;i++)
    	            for(int k=1;k+len2-1<=len_b;k++) {
    			int j=i+len1-1,l=k+len2-1;
    			if(len1+len2<=1) f[i][j][k][l]=1;
    			else {
    			    f[i][j][k][l]=0;
	    		    if(len1>1) f[i][j][k][l]|=(f[i+1][j-1][k][l]&&(a[i]==a[j]));
	    		    if(len2>1) f[i][j][k][l]|=(f[i][j][k+1][l-1]&&b[k]==b[l]));
	    		    if(len1&&len2) {
	    			   f[i][j][k][l]|=(f[i+1][j][k][l-1]&&(a[i]==b[l]));
	    			    f[i][j][k][l]|=(f[i][j-1][k+1][l]&&(a[j]==b[k]));
	    		    }
	    		}
    			if(f[i][j][k][l]) res=max(res,len1+len2); 
    	            }
    	cout<<res<<endl;
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/c4Lnn/p/12624114.html