51nod1092(lcs简单运用/dp)
生活随笔
收集整理的這篇文章主要介紹了
51nod1092(lcs简单运用/dp)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1092
?
題意:中文題誒~
?
思路:
解法1:最壞的情況就是在原字符串的右邊添加該字符串的倒序字符串咯,長度為a.size(),不難想到原字符串和其倒序字符串可能存在公共子序列,公共子序列含有的字符我們是不需要添加的(因為兩邊原本就有嘛).我們要使添加的字符最少,那么就是找到最大的公共子序列,再用a.size()減去公共子序列含有的字符數目就好啦,即:
ans=a.size()-lcs(a, b),?其中b為a的倒序字符串;
?
代碼:
1 #include <bits/stdc++.h> 2 #define MAXN 1010 3 using namespace std; 4 5 int dp[MAXN][MAXN]; 6 7 int main(void){ 8 string a, b; 9 cin >> a; 10 b=a; 11 reverse(b.begin(), b.end()); 12 int len=a.size(); 13 for(int i=0; i<len; i++){ 14 for(int j=0; j<len; j++){ 15 if(a[i]==b[j]){ 16 dp[i+1][j+1]=dp[i][j]+1; 17 }else{ 18 dp[i+1][j+1]=max(dp[i+1][j], dp[i][j+1]); 19 } 20 } 21 } 22 cout << len-dp[len][len] << endl; 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 <bits/stdc++.h> 2 #define MAXN 1010 3 using namespace std; 4 5 int dp[MAXN][MAXN]; //***dp[i][j]存儲從第j個字符開始,長度為i的字符串變成回文串最少需要添加的字符數 6 7 int main(void){ 8 string a; 9 cin >> a; 10 int len=a.size(); 11 for(int i=2; i<=len; i++){ 12 for(int j=0; j<len; j++){ 13 if(a[j]==a[j+i-1]){ 14 dp[i][j]=dp[i-2][j+1]; 15 }else{ 16 dp[i][j]=min(dp[i-1][j], dp[i-1][j+1])+1; 17 } 18 } 19 } 20 cout << dp[len][0] << endl; 21 return 0; 22 }?
轉載于:https://www.cnblogs.com/geloutingyu/p/6285971.html
總結
以上是生活随笔為你收集整理的51nod1092(lcs简单运用/dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【BZOJ-13962865】识别子串字
- 下一篇: shell 读取文件