#include <stdio.h>
#define d(i,j) dd[(i) * (m+2) + (j) ]
#define min(x,y) ((x) < (y) ? (x) : (y))
#define min3(a,b,c) ((a)< (b) ? min((a),(c)) : min((b),(c)))
#define min4(a,b,c,d) ((a)< (b) ? min3((a),(c),(d)) : min3((b),(c),(d)))
int dprint(int* dd, int n,int m){
int i,j;
for (i=0; i < n+2;i++){
for (j=0;j < m+2; j++){
}
}
return 0;
}
int dldist2(char *s, char* t, int n, int m) {
int *dd;
int i, j, cost, i1,j1,DB;
int INFINITY = n + m;
static int DA[256 * sizeof(int)];
if (!(dd
= (int*) malloc((n
+2)*(m
+2)*sizeof(int)))) { return -1;
}
d(0,0) = INFINITY;
for(i = 0; i < n+1; i++) {
d(i+1,1) = i ;
d(i+1,0) = INFINITY;
}
for(j = 0; j<m+1; j++) {
d(1,j+1) = j ;
d(0,j+1) = INFINITY;
}
// dprint(dd,n,m);
for(i = 1; i< n+1; i++) {
DB = 0;
for(j = 1; j< m+1; j++) {
i1 = DA[t[j-1]];
j1 = DB;
cost = ((s[i-1]==t[j-1])?0:1);
if(cost==0) DB = j;
d(i+1,j+1) =
min4(d(i,j)+cost,
d(i+1,j) + 1,
d(i,j+1)+1,
d(i1,j1) + (i-i1-1) + 1 + (j-j1-1));
}
DA[s[i-1]] = i;
// dprint(dd,n,m);
}
cost = d(n+1,m+1);
return cost;
}
int main(void) {
int cost;
int msize;
int nsize;
msize = 8;
nsize = 8;
cost = dldist2("ABNANA", "BANANA", nsize, msize);
printf("%.3f\n", cost
/ (float)(nsize
* msize
)); msize = 16;
nsize = 16;
cost = dldist2("ABNANA", "BANANA", nsize, msize);
printf("%.3f\n", cost
/ (float)(nsize
* msize
));
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIGQoaSxqKSBkZFsoaSkgKiAobSsyKSArIChqKSBdCiNkZWZpbmUgbWluKHgseSkgKCh4KSA8ICh5KSA/ICh4KSA6ICh5KSkKI2RlZmluZSBtaW4zKGEsYixjKSAoKGEpPCAoYikgPyBtaW4oKGEpLChjKSkgOiBtaW4oKGIpLChjKSkpCiNkZWZpbmUgbWluNChhLGIsYyxkKSAoKGEpPCAoYikgPyBtaW4zKChhKSwoYyksKGQpKSA6IG1pbjMoKGIpLChjKSwoZCkpKQoKaW50IGRwcmludChpbnQqIGRkLCBpbnQgbixpbnQgbSl7CiBpbnQgaSxqOwogZm9yIChpPTA7IGkgPCBuKzI7aSsrKXsKICAgIGZvciAoaj0wO2ogPCBtKzI7IGorKyl7CiAgICAgICAgcHJpbnRmKCIlMDJkICIsZChpLGopKTsKICAgIH0KICAgIHByaW50ZigiXG4iKTsKIH0KIHByaW50ZigiXG4iKTsKIHJldHVybiAwOwp9CgppbnQgZGxkaXN0MihjaGFyICpzLCBjaGFyKiB0LCBpbnQgbiwgaW50IG0pIHsKICAgIGludCAqZGQ7CiAgICBpbnQgaSwgaiwgY29zdCwgaTEsajEsREI7CiAgICBpbnQgSU5GSU5JVFkgPSBuICsgbTsKICAgIHN0YXRpYyBpbnQgREFbMjU2ICogc2l6ZW9mKGludCldOwoKICAgIG1lbXNldChEQSwgMCwgc2l6ZW9mKERBKSk7CgogICAgaWYgKCEoZGQgPSAoaW50KikgbWFsbG9jKChuKzIpKihtKzIpKnNpemVvZihpbnQpKSkpIHsKICAgICAgcHJpbnRmKCJtYWxsb2MgZXJyb3JcbiIpOwogICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgZCgwLDApID0gSU5GSU5JVFk7CiAgICBmb3IoaSA9IDA7IGkgPCBuKzE7IGkrKykgewogICAgICBkKGkrMSwxKSA9IGkgOwogICAgICBkKGkrMSwwKSA9IElORklOSVRZOwogICAgfQogICAgZm9yKGogPSAwOyBqPG0rMTsgaisrKSB7CiAgICAgIGQoMSxqKzEpID0gaiA7CiAgICAgIGQoMCxqKzEpID0gSU5GSU5JVFk7CiAgICB9ICAgICAgCi8vICAgIGRwcmludChkZCxuLG0pOwoKICAgIGZvcihpID0gMTsgaTwgbisxOyBpKyspIHsKICAgICAgREIgPSAwOwogICAgICBmb3IoaiA9IDE7IGo8IG0rMTsgaisrKSB7CiAgICAgICAgaTEgPSBEQVt0W2otMV1dOwogICAgICAgIGoxID0gREI7CiAgICAgICAgY29zdCA9ICgoc1tpLTFdPT10W2otMV0pPzA6MSk7CiAgICAgICAgaWYoY29zdD09MCkgREIgPSBqOwogICAgICAgIGQoaSsxLGorMSkgPQogICAgICAgICAgbWluNChkKGksaikrY29zdCwKICAgICAgICAgICAgICBkKGkrMSxqKSArIDEsCiAgICAgICAgICAgICAgZChpLGorMSkrMSwgCiAgICAgICAgICAgICAgZChpMSxqMSkgKyAoaS1pMS0xKSArIDEgKyAoai1qMS0xKSk7CiAgICAgIH0KICAgICAgREFbc1tpLTFdXSA9IGk7Ci8vICAgICAgZHByaW50KGRkLG4sbSk7CiAgICB9CiAgICBjb3N0ID0gZChuKzEsbSsxKTsKICAgIGZyZWUoZGQpOwogICAgcmV0dXJuIGNvc3Q7Cn0KCmludCBtYWluKHZvaWQpIHsKCWludCBjb3N0OwoJaW50IG1zaXplOwoJaW50IG5zaXplOwoJCgltc2l6ZSA9IDg7Cgluc2l6ZSA9IDg7Cgljb3N0ID0gZGxkaXN0MigiQUJOQU5BIiwgIkJBTkFOQSIsIG5zaXplLCBtc2l6ZSk7CglwcmludGYoIiUuM2ZcbiIsIGNvc3QgLyAoZmxvYXQpKG5zaXplICogbXNpemUpKTsKCW1zaXplID0gMTY7Cgluc2l6ZSA9IDE2OwoJY29zdCA9IGRsZGlzdDIoIkFCTkFOQSIsICJCQU5BTkEiLCBuc2l6ZSwgbXNpemUpOwoJcHJpbnRmKCIlLjNmXG4iLCBjb3N0IC8gKGZsb2F0KShuc2l6ZSAqIG1zaXplKSk7CgoJcmV0dXJuIDA7Cn0K