POJ 1159 Palindrome lcs擴充套件

2021-07-04 19:58:38 字數 883 閱讀 9011

題意:

看需要增加幾個字母可以使該串變成回文串

思路:lcs的擴充套件,把串反過來,然後找他們的最長公共子串行的長度,用n減去這個數就可以了

方法1: lcs普通

code

49720k 688ms

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

short c[5005][5005];

char x[5005], y[5005];

int main()

for(i = 1; i <= n; i++)

for(j = 1; j <= n; j++)

if(x[i-1]==y[j-1])

c[i][j] = c[i-1][j-1]+1;

else

if(c[i-1][j]>c[i][j-1])

c[i][j] = c[i-1][j];

else

c[i][j] = c[i][j-1];

printf("%d\n",n-c[n][n]);

}return 0;

}

方法2 滾動陣列

code

736k 797ms

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

short c[2][5005];

char x[5005], y[5005];

int main()

else}}

printf("%d\n",n-c[e][n]);

}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...

滾動陣列 poj1159 Palindrome

題意 在乙個字串中插入一些字元,使字串變成回文串,問插入的最小數量 原來還有這種逆天公式 把這個字串,和翻轉後的字串去算最長公共子串行,設為x 如果原長為l,那麼答案就是l x 因為,除了那部分公共子串行以外,只要把反序列的剩下的插入到正序裡面去,就會形成回文串了。然後這題資料比較大,但是好在求最長...