51nod1092 lcs簡單運用 dp

2022-02-20 01:47:06 字數 998 閱讀 1540

題意:中文題誒~

思路:解法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個變...