Luogu P1435 回文字串 解題報告

2022-04-30 18:21:06 字數 1265 閱讀 3939

主要大衣大意:

給定乙個字串,求至少加入多少個字元才能使字串變成回文字串

下面就是我一本正經的胡說八道題解

很顯然,這應該是一道典型的最長公共子串行的題目

因此,主要思想就是dp

方程式也挺好推的

於是我們就來講一下為什麼這題能用最長公共子串行(lcs)求解

求的是什麼?

想要使這個字串加入最少的字元變成乙個回文串,那麼肯定就是要是字串中不能回文的部分回文

說起來比較難理解,比如:ab3bd最少添的字元就是a對應的乙個a,最後d對應的乙個d

我們可以發現,最少要添的字元就是不能匹配的字元數=原字串長度len-最長回文串的長度

這就變成了求最長回文串的題目

怎麼求?

又經驗的人肯定就會用最長公共子串行去解,但是一些人可能要問為什麼,那麼我們這裡就來證明一下

由於回文串是回文的(廢話),也就是說,把原來的字串反轉一遍,最長回文串的長度還是不變

於是我們就變成了求兩串的公共子串行的長度——其實思想就是回文串正著和反著的效果是一樣的,也就是抓住這個特性,去求公共系序列的長度

轉移方程(最好自己去推一下):

if(a[i]==b[j])//目標狀態是f[len][len]

f[i][j]=f[i-1][j-1]+1;//表示i,j兩位置相等,那麼就由i-1,j-1的狀態(最優解)+1得到

else

f[i][j]=max(f[i-1][j],f[i][j-1]);//否則去掉i或j,轉移最優解

code:

#include#define n 1010

using namespace std;

int len;

char a[n],b[n];

int f[n][n];

int main()

最長上公升子串行(lis)

【模板】最長公共子串行

P1435 回文字串

回文詞是一種對稱的字串。任意給定乙個字串,通過插入若干字元,都可以變成回文詞。此題的任務是,求出將給定字串變成回文詞所需要插入的最少字元數。比如 ab3bd 插入2個字元後可以變成回文詞 dab3bad 或 adb3bda 但是插入少於2個的字元無法變成回文詞。注 此問題區分大小寫 輸入格式 乙個字...

P1435 回文字串(區間dp)

題目背景 ioi2000第一題 題目描述 回文詞是一種對稱的字串。任意給定乙個字串,通過插入若干字元,都可以變成回文詞。此題的任務是,求出將給定字串變成回文詞所需要插入的最少字元數。比如 ab3bd 插入2個字元後可以變成回文詞 dab3bad 或 adb3bda 但是插入少於2個的字元無法變成回文...

IOI2000 洛谷1435 回文字串

回文詞是一種對稱的字串。任意給定乙個字串,通過插入若干字元,都可以變成回文詞。此題的任務是,求出將給定字串變成回文詞所需要插入的最少字元數。比如 ab3bd 插入2個字元後可以變成回文詞 dab3bad 或 adb3bda 但是插入少於2個的字元無法變成回文詞。注 此問題區分大小寫 第一行乙個整數n...