首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

POJ 1159 Palindrome:最少插入構造回文 = 長度 - LCS

     編輯:C++ 入門

核心結論

最少插入字符數 = 字符串長度 - 字符串與其逆序的最長公共子序列(LCS)長度。因為 LCS 對應已經對稱的部分,其餘字符需成對插入。

空間優化 DP

一維數組 dp[j] 表示前 i 字符與逆序前 j 字符的 LCS。滾動更新需保存 old = dp[j-1](左上值)。

for (int i = 0; i < N; i++) {
    old = 0;
    for (int j = 0; j < N; j++) {
        temp = dp[j];
        if (s1[i] == s2[j]) dp[j] = old + 1;
        else dp[j] = max(temp, dp[j-1]);
        old = temp;
    }
}
printf("%d\n", N - dp[N-1]);

用 short 存儲 dp 節省內存(5000×5000 ≈ 25MB → 50MB 邊界)。注意僅單組測試數據。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved