題意:在乙個字串中插入一些字元,使字串變成回文串,問插入的最小數量
...原來還有這種逆天公式
把這個字串,和翻轉後的字串去算最長公共子串行,設為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 ...