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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

字符串距离(opj )(动态规划)

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符串距离(opj )(动态规划) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述2988:計算字符串距離

對于兩個不同的字符串,我們有一套操作方法來把他們變得相同,具體方法為:

  • 修改一個字符(如把“a”替換為“b”)
  • 刪除一個字符(如把“traveling”變為“travelng”)
    比如對于“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 )(动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。

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