題意:中文題誒~
思路:解法1:最壞的情況就是在原字串的右邊新增該字串的倒序字串咯,長度為a.size(),不難想到原字串和其倒序字串可能存在公共子串行,公共子串行含有的字元我們是不需要新增的(因為兩邊原本就有嘛).我們要使新增的字元最少,那麼就是找到最大的公共子串行,再用a.size()減去公共子串行含有的字元數目就好啦,即:
ans=a.size()-lcs(a, b), 其中b為a的倒序字串;
**:
1 #include 2#define maxn 1010
3using
namespace
std;45
intdp[maxn][maxn];67
int main(void
)else20}
21}22 cout << len-dp[len][len] <23 }
解法2:
我們可以用dp[i][j]儲存從第i個字元開始長度為j的字串變成會文串需要新增的最少字元,那麼初始化:
dp[0][j]=0, dp[1][j]=0,長度為0,1的字串自然是回文串啦;
狀態轉移方程式為:
if(a[j]==a[i+j-1] dp[i][j]=dp[i-1][j+1]
else dp[i][j]=min(dp[i-1][j], dp[i-1][j+1])+1
這些還是比較好理解的,直接上**好了..
**:
1 #include 2#define maxn 1010
3using
namespace
std;45
int dp[maxn][maxn]; //
***dp[i][j]儲存從第j個字元開始,長度為i的字串變成回文串最少需要新增的字元數67
int main(void
)else18}
19}20 cout << dp[len][0] <21return0;
22 }
LCS 51NOD 1092 回文字串
1092 回文字串 基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 回文串是指aba abba cccbccc aaaa這種左右對稱的字串。每個字串都可以通過向中間新增一些字元,使之變為回文字串。例如 abbc 新增2個字元可以變為 acbbca,也可以新增3個變...
51NOD 1092 回文字串 LCS
q 給定乙個串,問需要插入多少字元才能使其成為回文串,也就是左右對稱的串。經典求lcs題,即最長公共子串行,不用連續的序列。考慮o n2 解法,求lcs起碼得有兩個串,題中才給了乙個串,另乙個需要自己造,將給定的串反置,然後求這兩個串的lcs。假設兩個串為str1和str2,想辦法將規模降低,分兩種...
51Nod 1092 回文字串 LCS跟dp
1092 回文字串 基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 回文串是指aba abba cccbccc aaaa這種左右對稱的字串。每個字串都可以通過向中間新增一些字元,使之變為回文字串。例如 abbc 新增2個字元可以變為 acbbca,也可以新增3個變...