字符串距离(opj )(动态规划)
生活随笔
收集整理的這篇文章主要介紹了
字符串距离(opj )(动态规划)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述2988:計算字符串距離
對于兩個不同的字符串,我們有一套操作方法來把他們變得相同,具體方法為:
比如對于“abcdefg”和“abcdef”兩個字符串來說,我們認為可以通過增加/減少一個“g”的方式來達到目的。無論增加還是減少“g”,我們都僅僅需要一次操作。我們把這個操作所需要的次數定義為兩個字符串的距離。
給定任意兩個字符串,寫出一個算法來計算出他們的距離。
輸入
第一行有一個整數n。表示測試數據的組數,
接下來共n行,每行兩個字符串,用空格隔開。表示要計算距離的兩個字符串
字符串長度不超過1000。
輸出
針對每一組測試數據輸出一個整數,值為兩個字符串的距離。
解析
使用dp轉移:
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; }就完事啦
問題
然而…
又出了一堆bug
勿忘國恥
1.定義
一開始又草率了qwq
這題不能用最長公共子序列!
其實很顯然
但想dp的時候就是看不到
第n次了
dp一定要謹慎!!
2.初始化
少了一行很關鍵的東西
for(int i=1;i<=max(l1,l2);i++) dp[i][0]=dp[0][i]=i;實際意義也很顯然
所以dp的初始化也是要重視的
很多時候不止是賦個dp[0][0]=0這么簡單
代碼
#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 */總結
以上是生活随笔為你收集整理的字符串距离(opj )(动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西安光机所在超快分幅成像领域获进展,国内
- 下一篇: 科技潮人不掉队!IT之家 AI 大模型体