【牛客 - 327G】处女座与复读机(可编辑距离问题,dp)
題干:
鏈接:https://ac.nowcoder.com/acm/contest/327/G
來源:??途W(wǎng)
?
一天,處女座在??退惴ㄈ豪锇l(fā)了一句“我好強(qiáng)啊”,引起無數(shù)的復(fù)讀,可是處女座發(fā)現(xiàn)復(fù)讀之后變成了“處女座好強(qiáng)啊”。處女座經(jīng)過調(diào)查發(fā)現(xiàn)群里的復(fù)讀機(jī)都是失真的復(fù)讀機(jī),會(huì)固定的產(chǎn)生兩個(gè)錯(cuò)誤。一個(gè)錯(cuò)誤可以是下面的形式之一:
1.?????? 將任意一個(gè)小寫字母替換成另外一個(gè)小寫字母
2.?????? 在任意位置添加一個(gè)小寫字母
3.?????? 刪除任意一個(gè)字母
處女座現(xiàn)在在群里發(fā)了一句話,他收到了一個(gè)回應(yīng),他想知道這是不是一個(gè)復(fù)讀機(jī)。
輸入描述:
兩行 第一行是處女座說的話s 第二行是收到的回應(yīng)t s和t只由小寫字母構(gòu)成且長(zhǎng)度小于100輸出描述:
如果這可能是一個(gè)復(fù)讀機(jī)輸出”YES”,否則輸出”NO”示例1
輸入
復(fù)制
abc abcde輸出
復(fù)制
YES說明
abc->abcd->abcde示例2
輸入
復(fù)制
abcde abcde輸出
復(fù)制
YES說明
abcde->abcdd->abcde備注:
只要能經(jīng)過兩步變換就從s得到t就有可能是復(fù)讀機(jī)。解題報(bào)告:
? ? 轉(zhuǎn)化一下就是可編輯距離的裸題。
? ? 題目的意思是有兩個(gè)錯(cuò)誤的才輸出YES,但是首先我們知道如果求出的ans=2那一定是可以的,但是對(duì)于ans=1:如果是替換,那我們可以先增加一步操作換成別的;如果是增加,那我們可以先增加一個(gè)別的然后再換成正解;如果是刪除,那我們可以先把要?jiǎng)h除的字符換成別的然后再刪除??傊產(chǎn)ns=1的我們可以增加到ans=2,也就是輸出YES。ans=0的更不多說,也是輸出YES。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair using namespace std; const int MAX = 2e2 + 5; char s[MAX],t[MAX]; ll dp[MAX][MAX]; int main() {cin>>s+1;cin>>t+1;int len1 = strlen(s+1);int len2 = strlen(t+1);memset(dp,0x3f3f,sizeof dp);dp[0][0]=0;for(int i = 1; i<=len1; i++) {for(int j = 1; j<=len2; j++) {if(s[i] == t[j]) dp[i][j] = dp[i-1][j-1];else {ll tmp1 = dp[i][j] = dp[i-1][j-1]+1;//操作1ll tmp2 = dp[i-1][j]+1;ll tmp3 = dp[i][j-1]+1;dp[i][j] = min(tmp1,min(tmp2,tmp3));}}}if(dp[len1][len2] <= 2) puts("YES");else puts("NO");return 0 ; }?
總結(jié)
以上是生活随笔為你收集整理的【牛客 - 327G】处女座与复读机(可编辑距离问题,dp)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【2019牛客暑期多校训练营(第二场)-
- 下一篇: 【HDU - 5963】朋友(博弈,思维