牛客每日一題3 26 合併回文子串 動態規劃

2021-10-04 10:07:04 字數 2918 閱讀 9261

首先這種題肯定是動態規劃!!!!!不要往其他地方想。要怎麼做呢先從單個串要怎麼判斷區間最長回文來說。單個串如果要判斷任意乙個區間[l,r]是不是回文可以去寫區間dp,對於乙個串長度大於2的回文串,如果要在此基礎上在延長串的長度必然是在頭尾加兩個,所以對於乙個串的就可以寫出方程 f[l][r] |= f[l+1][r-1],(當a[l]==a[r]時);

現在到了兩個串,其實思路差不多,兩個串要拼出乙個回文串也必然要在原先滿足的基礎上在加兩個字母。那麼我們這麼設計狀態

f[i][[j][x][y],代表a串使用了[i,j], b串使用了[x,y]能不能構成回文。

如果是在原先的回文串基礎上增加兩個字母,則哪個字母當頭,哪個字母當尾,必然只有四種情況.

解釋一下第乙個其他都是同理可得,當a串的i位置的字母等於b串j位置的字元,則我們可以看a的[i + 1, j -1]和b串的[x, y ]能不能構成回文,如果可以,則[i,j] [x,y]必然也是乙個回文串。

這樣子去列舉就可以啦,真的十分的暴力。複雜度是o(tn*4)

其他注意的要點就是i和x要倒序列舉,因為你前面的狀態需要後面的狀態。還有就是當區間+1,-1後變成非法區間,就僅僅判斷剩下那個合法區間是不是回文串就可以了!最後**跑579ms還行。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define int long long

#define double long double

using

namespace std;

#define pi 3.1415926535898

#define eqs 1e-17

const

long

long max_ =50+

2;const

int mod =

1e9+7;

const

int inf =

1e9+7;

const

long

long inf =

1e18

;int

read()

while

(ch >=

'0'&&ch <=

'9')

return s * f;

}inline

void

write

(int x)

if(x >9)

write

(x /10)

;putchar

(x %10+

'0');}

inline

intmin

(int a,

int b)

inline

intmax

(int a,

int b)

bool f[max_]

[max_]

[max_]

[max_]

;int ans;

char a[max_]

, b[max_]

;//00 01 10 11

// 0 1 2 3

int pana[max_]

[max_]

, panb[max_]

[max_]

,lena,lenb;

void

solve()

}}for(

int len =

3; len <= lena; len++)}

}for

(int len =

1; len <=

min(lenb,2)

; len++)}

}for

(int len =

3; len <= lenb; len++)}

}}signed

main()

else f[i]

[j][x]

[y]|

= panb[x]

[y];}if

(a[i]

== b[y])if

(x == y)

f[i]

[j][x]

[y]|

= f[i +1]

[j][x]

[y -1]

;}if(b[x]

== a[j])if

(x == y)

f[i]

[j][x]

[y]|

= f[i]

[j -1]

[x +1]

[y];}if

(b[x]

== b[y]

&& x < y)

else f[i]

[j][x]

[y]|

= pana[i]

[j];}if

(f[i]

[j][x]

[y])

ans =

max(ans,

(j - i +1)

+(y - x +1)

);}}

}}cout << ans << endl;

memset

(pana,0,

sizeof

(pana));

memset

(panb,0,

sizeof

(panb));

memset

(f,0

,sizeof

(f));}

return0;

}

牛客每日一題 合併回文子串(區間DP)

題目鏈結 題目描述 輸入兩個字串a和b,合併成乙個串c,屬於a和b的字元在c中順序保持不變。如 abc 和 xyz 可以被組合成 axbycz 或 abxcyz 等。我們定義字串的價值為其最長回文子串的長度 回文串表示從正反兩邊看完全一致的字串,如 aba 和 xyyx 需要求出所有可能的c中價值最...

牛客網 每日一題 3月26日 合併回文子串

題目鏈結 時間限制 c c 2秒,其他語言4秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 輸入兩個字串a和b,合併成乙個串c,屬於a和b的字元在c中順序保持不變。如 abc 和 xyz 可以被組合成 axbycz 或 abxcyz 等...

牛客NC13230 合併回文子串

題目鏈結 題目描述 輸入兩個字串a和b,合併成乙個串c,屬於a和b的字元在c中順序保持不變。如 abc 和 xyz 可以被組合成 axbycz 或 abxcyz 等。我們定義字串的價值為其最長回文子串的長度 回文串表示從正反兩邊看完全一致的字串,如 aba 和 xyyx 需要求出所有可能的c中價值最...