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 必然回文,...