首先,我們把字串反轉,然後用反串和原串求最大公共子串行,再用字串長度減去最大公共子串行的長度就是答案,我們還可以用滾動陣列優化記憶體
狀態轉移方程:
(i長度的a串和j長度的b串的最長公共子串行長度)
1.dp[i-1][j-1]+1 a[i]=b[j]
dp[i][j]=
2.max(dp[i][j-1],dp[i-1][j]) a[i]!=b[j]
#include#include#include
#include
#include
#include
using
namespace
std;
int re[2][1005];//
使用滾動陣列優化了空間
intmain()
else re[(i+1)&1][j+1]=re[i&1][j+1]>re[(i+1)&1][j]?re[i&1][j+1]:re[(i+1)&1][j];//
條件表示式是最省時間的
} printf(
"%d\n
",a.length()-re[(a.length())&1
][b.length()]); }
return0;
}
NYOJ 37 回文字串
思想 在紙上測試幾組資料,發現先逆轉原來的字串,再用原來的字串跟逆轉後的字串進行比較,求得的最長公共子串行就是回文串,也就是不需要新增的,再用總長度減去最長公共子串行就可以得到最少需要新增的字元數。就簡單了,以前寫過的稍稍改下就直接貼上來了。include includeint f 1001 100...
nyoj 37 回文字串
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如 aba 當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文...
nyoj 37 回文字串
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如 aba 當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文...