DP訓練 最長對稱子串(回文串,區間dp)

2021-09-11 18:21:39 字數 1289 閱讀 1915

l2-008 最長對稱子串 (25 分)

對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定is pat&tap symmetric?,最長對稱子串為s pat&tap s,於是你應該輸出11。

輸入格式:

輸入在一行中給出長度不超過1000的非空字串。

輸出格式:

在一行中輸出最長對稱子串的長度。

輸入樣例:

is pat&tap symmetric?

輸出樣例:

11【思路】

這道題我一開始就是用遞迴思路在想,然後再用動規優化實現。根據區間dp的思想,設f(i, j)表示字串區間i—j中的最長對稱子串的長度。這樣設那麼遞迴關係實際上就出來了。設字串長度為length, 那麼我最後要求的是f(0, length - 1)的值

如果a[i] != a[j]那麼,f(i, j) = max(f(i + 1, j), f(i, j - 1)), 縮小區間

若兩者相等,那就多一種情況, 那麼f(i, j) = max(f(i + 1, j), f(i, j - 1)), 若內部是回文串, 如:abcba,就還要加乙個判斷。if(是回文串)---- then—f(i, j) = max( f(i, j) , f(i + 1, j - 1) + 2 );

ac **:

#include

using namespace std;

int length =0;

const

int maxn =

1005

;char a[maxn]

;int dp[maxn]

[maxn]

;int

max(

int x,

int y)

intdp()

//else

for(

int len =

1;len < length;len++)}

//判斷內部是不是回文串

if(flag)

}else}}

//print dp

/*for(int i = 0;i < length;i++)

cout << endl;

}*/return dp[0]

[length -1]

;}intmain()

printf

("%d\n",dp

());

return0;

}

遞迴思維找遞推式和子問題,然後用區間dp實現。所以遞迴和動規的關係是非常緊密的!

最長回文子串(區間dp)

輸入乙個字串str,輸出str裡最長回文子串的長度。回文串 指aba abba cccbccc aaaa這種左右對稱的字串。串的子串 乙個串的子串指此 字元 串中連續的一部分字元構成的子 字元 串 例如 abc 這個串的子串 空串 a b c ab bc abc 輸入str str的長度 1000 ...

DP 最長回文子串

dp問題,最長回文子串 最長回文子串問題指的是在乙個字串中,是回文子串的長度的最大值.這裡的回文子串是連續的.如字串 patzjujztaccbcc 他的最長回文子串是 atzjujzta 長度為9,當然它還有其他回文子串如 ccbcc 但是長度不夠長.這類問題似乎有多種解法,複雜度從o n 3 到...

最長回文子串DP

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 分析 dpdp j i 表示從j到i的子串 若dp j i 為回文串,則dp j 1 i 1 必然回文,...