Description :
尋找字符串的最長迴文子序列的長度 .
和子串不同,子串要求是連續的, 但是迴文序列可以不連續
比如 “axbnOba” 的最長迴文子序列就是 “abOba” ,長度爲 5 .
子問題 : 單字符一定是迴文序列 .
對任意字符串,如果頭和尾相同,那麼它的最長迴文子序列一定是:
“去頭尾後的部分的最長迴文子序列 + 頭和尾 “。
如果頭和尾不同,那麼它的最長迴文子序列是:
“去頭的部分的最長迴文子序列 和 去尾的部分的最長迴文子序列” 中較長的那一個。
設字符串爲s,設 dp(i,j) 表示 s[i..j]的最長迴文子序列的長度。比如 dp[0,1] 就表示 s[0..1] 的最長迴文序列的長度 . 而 dp(m,m) 表示 s[m] 這個字符的最長迴文序列長度 ,爲 1 .
## 寫出狀態轉移方程 :
初始化 : 當i>j時,dp(i,j) = 0 , 當 i=j 時,dp(i,j)=1 (單字符迴文序列的長度爲1)
當 i
int getsublength(string s)
int n = s.length();
int f[n][n] ;
memset(f,0,sizeof(f));
for (int i = n-1; i>=0; i--) {
f[i][i]=1; //執行過程中完成初始化
for (int j = i+1; j < s.length(); j++){
if (s[i]==s[j]){
f[i][j]=f[i+1][j-1]+2;}
else
f[i][j]=max(f[i][j-1],f[i+1][j]);
}
}
return cout<<f[0][s.length()-1]<<endl;
}
感謝 :http://blog.csdn.net/xiaofei_it/article/details/16813591 提供過的思路