詳細解題報告可以看這個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進製表示...