最長迴文子序列

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 提供過的思路

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章