滾動陣列 poj1159 Palindrome

2021-07-04 02:40:36 字數 675 閱讀 1698

題意:在乙個字串中插入一些字元,使字串變成回文串,問插入的最小數量

...原來還有這種逆天公式

把這個字串,和翻轉後的字串去算最長公共子串行,設為x

如果原長為l,那麼答案就是l-x

因為,除了那部分公共子串行以外,只要把反序列的剩下的插入到正序裡面去,就會形成回文串了。。

然後這題資料比較大,,但是好在求最長公共子串行可以用滾動陣列解決

#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

typedef pairpii;

const int mx = 5500 + 5;

const int inf = 0x3f3f3f3f;

char s1[mx], s2[mx];

int dp[2][mx];

int main()

int cur = 0, nxt = 1;

for(int i = 1; i <= l; i++) else

}swap(cur, nxt);

}printf("%d\n", l - dp[cur][l]);

}return 0;

}

POJ 1159滾動陣列

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

poj1159 dp 滾動陣列

如題 給出乙個字串和它的長度,要求輸出最少要加幾個字母這個字串變成回文串。增加回文串的數量 字串長度 字串和它的逆序的最長公共子串行的長度。字串長5000 如果開dp肯定超記憶體,可以使用short定義陣列。不難發現,dp的狀態轉移方程dp i j max dp i 1 j dp i j 1 或dp...

POJ 1159 回文LCS滾動陣列優化

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