日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51nod1092(lcs简单运用/dp)

發布時間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。