SDOI2006 最短距離

2022-05-25 12:54:12 字數 1335 閱讀 1055

洛谷題目鏈結

宣告:

本篇文章只大概講思路

原串設為$s1$,目標串設為$s2$,$n1,n2$分別為他們的長度

我們考慮$dp$,設$f[i][j]$表示$s1$中刪除到了第$i$個字元,$s2$中新增到了第$j$個字元,那麼對於每種操作,我們如下轉移:

$1、delete$:(刪除操作,不需要判斷,直接轉移,此時的費用為$s1$刪除到$i-1$,$s2$新增到$j$時的費用加上刪除的費用並且取最小值)

$f[i][j]=min(f[i][j],f[i-1][j]+pay[1]$

$2、repalce$:(替換操作,不需要判斷,直接轉移,此時的費用為$s1$刪除到$i-1$,$s2$新增到$j-1$時的費用加上費用取最小值)

$f[i][j]=min(f[i][j],f[i-1][j-1]+pay[2])$

$3、copy$:(複製操作,需要判斷,當現在的$i,j$相同時轉移)

$if(s1[i]==s2[j])

f[i][j]=min(f[i][j],f[i-1][j-1]+pay[3]);$

$4、insert$:(插入操作,不需要判斷,直接轉移)

$f[i][j]=min(f[i][j],f[i][j-1]+pay[4])$

$5、twiddle$:(需要判斷,當$i>=2\&\&j>=2\&\&s1[i-1]==s2[j]\&\&s1[i]==s2[j-1]$的時候轉移)

$if(i>=2\&\&j>=2\&\&s1[i-1]==s2[j]\&\&s1[i]==s2[j-1])$

$f[i][j]=min(f[i][j],f[i-2][j-2]+pay[5])$

$6、kill$:(單獨拿出來用,最後判斷一下)

$for(int i=1;i

$f[n1][n2]=min(f[n1][n2],f[i][n2]+(n1-i)*pay[1]-1)$

**如下:

#include#include#include#define n 210

#define inf 0x3f3f3f3f

using namespace std;

char s1[n],s2[n];

int n1,n2;

int pay[6],f[n][n];//f[i][j]中i表示s1中已經刪除到i個字元,j表示s2串中已經新增到j個字元

int main()

} for(int i=1;if[n1][n2]=min(f[n1][n2],f[i][n2]+(n1-i)*pay[1]-1);

printf("%d",f[n1][n2]);

}

1407 最短距離

兩個點 a b 均在做勻速直線運動。給出 t 0時刻 a b 的座標,以及 a b 的速度,計算t 0時兩個點的距離的最小值。輸入的第一行包含乙個整數 t 1 t 200 表示一共有 t 組測試資料。對於每組測試資料,第一行包含4個整數 x a y a v ax v ay 103 x a y a v...

編輯最短距離

給定兩個字串s和t,對於t我們允許三種操作 1 在任意位置新增任意字元 2 刪除存在的任意字元 3 修改任意字元 問最少操作多少次可以把字串t變成s?例如 s abcf t dbfg 那麼我們可以 1 把d改為a 2 刪掉g 3 加入c 所以答案是3。1 把t中字元全刪了,再新增s的全部字元,操作次...

素數最短距離問題

素數距離問題 時間限制 3000 ms 記憶體限制 65535 kb 難度 2 描述現在給出你一些數,要求你寫出乙個程式,輸出這些整數相鄰最近的素數,並輸出其相距長度。如果左右有等距離長度素數,則輸出左側的值及相應距離。如果輸入的整數本身就是素數,則輸出該素數本身,距離輸出0 輸入第一行給出測試資料...