POJ 1159 回文LCS滾動陣列優化

2022-04-14 14:49:21 字數 1081 閱讀 5461

詳細解題報告可以看這個ppt

這題如果是直接開int 5000 * 5000  的空間肯定會mle,優化方法是採用滾動陣列。

原lcs轉移方程 : 

dp[i][j] = dp[i - 1][j] + dp[i][j  -1]

因為 dp[i][j] 只依賴於 dp[i - 1][j] 和 dp[i][j - 1]

所以可以採用滾動陣列如下:

dp[i % 2][j] = dp[(i - 1) % 2][j] + dp[i % 2][j - 1]

可以實現節省空間的方法

答案儲存在 dp[n % 2][n] 中

source code:

//

#pragma comment(linker, "/stack:16777216")

//for c++ compiler

#include #include

#include

#include

#include

#include

#include

#include

#define ll long long

#define max(a,b) (((a) > (b)) ? (a) : (b))

#define min(a,b) (((a) < (b)) ? (a) : (b))

#define abs(x) (((x) > 0) ? (x) : (-(x)))

using

namespace

std;

const

int inf = 0x3f3f3f3f

;const

int maxn = 500

;int dp[2][5005

];int

main()

else}}

cout

<< n - dp[n % 2][n] << endl; //

answer = x.length() - lcs(x, y)

}

return0;

}

POJ 1159滾動陣列

題意 給你一串字串,讓你求最少加入幾個字元,才能使得這個字串是個回文串。做法 設a i 是這個字串,b i 是這個字串的逆序串。那麼a i b i 的最長公共子串行就是所求的字串裡擁有的最大的回文串。然後用總串長減去最大的回文串長度即為所求。求最長公共子串行的公式為 dp i j max dp i ...

POJ 1159 如何構造回文序列

poj1159 給定乙個字串str,問最少需要新增多少個字串能使得str變成回文串?該問題是最長公共子串行的問題的延伸。字串 str 長度為 n,字串的逆串 istr。他們的最長公共子串行的長度 l lcs str,istr 公共子串行中的元素不需要新增對稱,剩餘的元素需要新增一元素使其對稱。所以最...

52 回文平方數

52 回文平方數 問題描述 回文數是指從左向右念和從右向左唸都一樣的數。如12321就是乙個典型的回文數。給定乙個進製b 2 輸入說明 共一行,乙個單獨的整數b b用十進位制表示,比如18 輸出說明 每行兩個數字,第二個數是第乙個數的平方,且第二個數是回文數。注意 輸出時,這兩個數都應該以b進製表示...