主要大衣大意:
給定乙個字串,求至少加入多少個字元才能使字串變成回文字串
下面就是我一本正經的胡說八道題解
很顯然,這應該是一道典型的最長公共子串行的題目
因此,主要思想就是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...