字符串距离(opj )(动态规划)
生活随笔
收集整理的這篇文章主要介紹了
字符串距离(opj )(动态规划)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目描述2988:計(jì)算字符串距離
對(duì)于兩個(gè)不同的字符串,我們有一套操作方法來(lái)把他們變得相同,具體方法為:
比如對(duì)于“abcdefg”和“abcdef”兩個(gè)字符串來(lái)說(shuō),我們認(rèn)為可以通過(guò)增加/減少一個(gè)“g”的方式來(lái)達(dá)到目的。無(wú)論增加還是減少“g”,我們都僅僅需要一次操作。我們把這個(gè)操作所需要的次數(shù)定義為兩個(gè)字符串的距離。
給定任意兩個(gè)字符串,寫(xiě)出一個(gè)算法來(lái)計(jì)算出他們的距離。
輸入
第一行有一個(gè)整數(shù)n。表示測(cè)試數(shù)據(jù)的組數(shù),
接下來(lái)共n行,每行兩個(gè)字符串,用空格隔開(kāi)。表示要計(jì)算距離的兩個(gè)字符串
字符串長(zhǎng)度不超過(guò)1000。
輸出
針對(duì)每一組測(cè)試數(shù)據(jù)輸出一個(gè)整數(shù),值為兩個(gè)字符串的距離。
解析
使用dp轉(zhuǎn)移:
if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]; else{dp[i][j]=min(dp[i-1][j-1](修改),min(dp[i-1][j](刪前),dp[i][j-1](刪后)))+1; }就完事啦
問(wèn)題
然而…
又出了一堆bug
勿忘國(guó)恥
1.定義
一開(kāi)始又草率了qwq
這題不能用最長(zhǎng)公共子序列!
其實(shí)很顯然
但想dp的時(shí)候就是看不到
第n次了
dp一定要謹(jǐn)慎!!
2.初始化
少了一行很關(guān)鍵的東西
for(int i=1;i<=max(l1,l2);i++) dp[i][0]=dp[0][i]=i;實(shí)際意義也很顯然
所以dp的初始化也是要重視的
很多時(shí)候不止是賦個(gè)dp[0][0]=0這么簡(jiǎn)單
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long const int N=2e3+100; int n,m; char a[N],b[N]; int dp[N][N],l1,l2; int main(){scanf("%d",&n);for(int k=1;k<=n;k++){scanf(" %s",a+1);scanf(" %s",b+1);l1=strlen(a+1);l2=strlen(b+1);//cout<<a+1;dp[0][0]=0;for(int i=1;i<=max(l1,l2);i++) dp[i][0]=dp[0][i]=i; // int m=max(l1,l2);for(int i=1;i<=l1;i++){for(int j=1;j<=l2;j++){if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1];else{dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;} // printf("i=%d j=%d dp=%d\n",i,j,dp[i][j]);}}printf("%d\n",dp[l1][l2]);}return 0; } /* 3 abcdefg abcdef ab ab mnklj jlknm */總結(jié)
以上是生活随笔為你收集整理的字符串距离(opj )(动态规划)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 西安光机所在超快分幅成像领域获进展,国内
- 下一篇: 判断整除(opj)(动态规划)