動態規劃 回文子串行個數

2022-09-04 06:36:14 字數 2235 閱讀 2124

description

給定乙個字串行,求這個序列中回文子串行的個數。

包含多組用例,每個用例為一行字串行(只含有字母和數字,不包含空格,字串長度小於100)。

輸出該字串行中回文子串行的個數。

aaaa aaba

15 10

對於樣例2,有如下回文子串行(為便於觀察,我們另字串行為a1 a2 b a3):

a1a2ba3

a1 a2

a1 a3

a2 a3

a1 b a3

a2 b a3

a1 a2 a3

思路方法與**均**自  (侵刪)

參考  (侵刪)

動態規劃思想

對於任意字串,如果頭尾字元不相等,則字串的回文子串行個數就等於去掉頭的字串的回文子串行個數+去掉尾的字串的回文子串行個數-去掉頭尾的字串的回文子串行個數;如果頭尾字元相等,那麼除了上述的子串行個數之外,還要加上首尾相等時新增的子串行個數,1+去掉頭尾的字串的回文子串行個數,1指的是加上頭尾組成的回文子串行,如aa,bb等。

因此動態規劃的狀態轉移方程為:

設字串為str,長度為n,p[i][j]表示第i到第j個字元間的最長子序列的長度(i<=j),則:

狀態初始條件:dp[i][i]=1 (i=0:n-1)

狀態轉移方程:dp[i][j]=dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1]  if(str[i]!=str[j])

dp[i][j]=dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1]+dp[i+1][j-1]+1=dp[i+1][j] + dp[i][j-1]+1  if (str[i]==str[j])

對任意字串,如果頭和尾相同,那麼它的最長回文子串行一定是去頭去尾之後的部分的最長回文子串行加上頭和尾。如果頭和尾

不同,那麼它的最長回文子串行是去頭的部分的最長回文子串行和去尾的部分的最長回文子串行的較長的那乙個。

設字串為str,dp(i,j)表示str[i..j]的最長回文子串行。

狀態轉移方程如下:

當i > j時,dp[i,j]= 0。

當i = j時,dp[i,j] = 1。

當i < j並且str[i] == str[j]時,dp[i][j] = dp[i+1][j-1]+2;

當i < j並且str[i] ≠ str[j]時,dp[i][j] = max(dp[i][j-1],dp[i+1][j]);

注意如果i+1 == j並且str[i] == str[j]時,dp[i][j] = dp[i+1][j-1]+2 = dp[j,j-1]+2 = 2,這就是「當i > j時f(i,j)=0」的好處。

由於dp[i][j]依賴i+1,所以迴圈計算的時候,第一維必須倒過來計算,從len-1到0。

最後,s的最長回文子串行長度為dp[0][len-1]。

#include #include 

using

namespace

std;

int numofpalindromesubsequence(string

str)

}return dp[0][len-1];}

intmain()

return0;

}

於是向學霸copy了一段能ac的** 如下 

#include //

用來求最長回文子串行的長度

#include #include

#include

#include

#define maxsize 105

#define vi vector#define vvi vector>

#define vll vector#define vvll vector>

using

namespace

std;

long lengthoflongestpalindlrome(char

ch)

else}}

return dp[0][len - 1];}

long

long numofpalinrome(char

ch) }}

return dp[0][len - 1];}

intmain()

return0;

}

動態規劃 回文詞

from zossin 回文詞 國際資訊學奧林匹克競賽 ioi 競賽原題 描述 description 回文詞是一種對稱的字串 也就是說,乙個回文詞,從左到右讀和從右到左讀得到的結果是一樣的。任意給定乙個字串,通過插入若干字元,都可以變成乙個回文詞。你的任務是寫乙個程式,求出將給定字串變成回文詞所需...

動態規劃 回文子串的長度

給定乙個字串,求其最長的回文子串的長度。如字串 abcdcba 的最長回文子串長度為7,而 aebfcgdhcibja 的最長回文也是 abcdcba 長度也是7.分析 典型的動態規劃問題,用dp i j 記錄字串中從字元 i 到字元 j 中最長回文子串的長度,則 if s.charat i s.c...

力扣 動態規劃 回文子串

描述 給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串。示例 1 輸入 abc 輸出 3 解釋 三個回文子串 a b c 示例 2 輸入 aaa 輸出 6 說明 6個回文子串 a a a aa aa aaa 注意...