如題:
給出乙個字串和它的長度,要求輸出最少要加幾個字母這個字串變成回文串。
增加回文串的數量=字串長度-字串和它的逆序的最長公共子串行的長度。
字串長5000 如果開dp肯定超記憶體,可以使用short定義陣列。
不難發現,dp的狀態轉移方程dp[i][j]=max(dp[i-1][j],dp[i][j-1])或dp[i][j]=dp[i-1][j-1]+1,當前dp的值只和上一行或上一列有關。所以滾動陣列優化。
開dp[2][5005]就可以。dp=max(dp[(i-1)%2][j],dp[i%2][j-1])或dp[i][j]=dp[(i-1)%2][j-1].
#include
using namespace std;
#include
#include
int dp[2][5005];
int max(int x,int y)
int main()
else
dp[i%2][j]=max(dp[(i-1)%2][j],dp[i%2][j-1]);
}cout< 題意 給你一串字串,讓你求最少加入幾個字元,才能使得這個字串是個回文串。做法 設a i 是這個字串,b i 是這個字串的逆序串。那麼a i b i 的最長公共子串行就是所求的字串裡擁有的最大的回文串。然後用總串長減去最大的回文串長度即為所求。求最長公共子串行的公式為 dp i j max dp i ... 題意 在乙個字串中插入一些字元,使字串變成回文串,問插入的最小數量 原來還有這種逆天公式 把這個字串,和翻轉後的字串去算最長公共子串行,設為x 如果原長為l,那麼答案就是l x 因為,除了那部分公共子串行以外,只要把反序列的剩下的插入到正序裡面去,就會形成回文串了。然後這題資料比較大,但是好在求最長... 這道題本來想用map儲存price所能達到的最大bandwidth,各種tle之後看了discuss,得知雖然price可能很大,但bandwidth卻範圍有限,於是對bandwidth用了滾動陣列dp 考慮 用pre b p表示為標號為i 1的裝置選好製造商後達到的總頻寬為b時的最小 對於標號為i...POJ 1159滾動陣列
滾動陣列 poj1159 Palindrome
POJ 1018(DP 滾動陣列)