日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

牛客网【每日一题】3月26日 合并回文子串

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客网【每日一题】3月26日 合并回文子串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題號:NC13230
名稱:合并回文子串
來源:美團2017年CodeM大賽-初賽A輪

題目鏈接

時間限制:C/C++ 2秒,其他語言4秒 空間限制:C/C++ 262144K,其他語言524288K 64bit IO Format:
%lld

題目描述

輸入兩個字符串A和B,合并成一個串C,屬于A和B的字符在C中順序保持不變。如"abc"和"xyz"可以被組合成"axbycz"或"abxcyz"等。
我們定義字符串的價值為其最長回文子串的長度(回文串表示從正反兩邊看完全一致的字符串,如"aba"和"xyyx")。
需要求出所有可能的C中價值最大的字符串,輸出這個最大價值即可 輸入描述:

第一行一個整數T(T ≤ 50)。 接下來2T行,每兩行兩個字符串分別代表A,B(|A|,|B| ≤ 50),A,B的字符集為全體小寫字母。

輸出描述:

對于每組數據輸出一行一個整數表示價值最大的C的價值。
示例1

輸入

2 aa bb a aaaabcaa

輸出

4 5

思路:區間dp問題
dp[i][j][m][n]表示A中下標i到j-1以及B中下標m到n-1的串,能否組成回文串
(dp值為零則表示不構成回文串,不為零則表示構成)
首先:字符本身是回文串
其次,分為四種情況
a[i]==a[j-1] dp[i][j][m][n]+=c[i+1][j-1][m][n];
因為dp我們只考慮是否為0或非0,所以dp之間可以+=也可以|=,都不影響
(當A的第i為和第j-1位相同時,那么dp[i][j]是否為回文串就取決于比它小一層的dp[i+1][j-1],這樣一次往里推,就可以推到以一種情況)
b[m]==b[n-1] dp[i][j][m][n]+=c[i][j][m+1][n-1];
(和上一個思路相同)

a[i]==b[n-1] dp[i][j][m][n]+=c[i+1][j][m][n-1];
(當A的i與B的n-1相同時,那么dp[i][][][n]是否為回文串就取決于A的后一位i+1和B的前一位n-1的情況)
a[m]==b[j-1] dp[i][j][m][n]+=c[i][j-1][m+1][n];
代碼

#include<bits/stdc++.h> typedef long long ll; using namespace std; inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w; } const int maxn=60; int dp[maxn][maxn][maxn][maxn]; int main() {int t;cin>>t;string a,b;while(t--){int mx=0;cin>>a>>b;for(int ti=0;ti<=a.length();ti++)//第一個字符提供的長度{for(int tj=0;tj<=b.length();tj++){for(int i=0;i+ti<=a.length();i++)//第一個字符為開頭 {for(int j=0;j+tj<=b.length();j++){int lena=ti+i;//區間[i,lena-1] int lenb=tj+j; if(tj+ti<=1)dp[i][lena][j][lenb]=1;else {dp[i][lena][j][lenb]=0;if(ti>=2&&a[i]==a[lena-1])dp[i][lena][j][lenb]|=dp[i+1][lena-1][j][lenb];if(tj>=2&&b[j]==b[lenb-1])dp[i][lena][j][lenb]|=dp[i][lena][j+1][lenb-1];if(ti>=1&&tj>=1&&a[i]==b[lenb-1])dp[i][lena][j][lenb]|=dp[i+1][lena][j][lenb-1];if(ti>=1&&tj>=1&&b[j]==a[lena-1])dp[i][lena][j][lenb]|=dp[i][lena-1][j+1][lenb];}if(dp[i][lena][j][lenb])mx=max(mx,tj+ti);}}}}cout<<mx<<endl;} } /* dp[i][lena][j][lenb] */

另外
tj和tn從0開始,不斷討論A中i到i+tj和B中m到tn的回文字符串

總結

以上是生活随笔為你收集整理的牛客网【每日一题】3月26日 合并回文子串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。