#5
by かずま » 7年前
まだ解決にならないのでしょうか?
int d[100][100]; ですが、表を上から順番に作っていくので、
ある行と、その次の行の二つの行だけでできます。
コード:
#include <stdio.h> // printf
#include <wchar.h> // wcslen, wscanf
#include <locale.h> // setlocale
int min(int a, int b, int c)
{
return a < b ? (a < c ? a : c) : (b < c ? b : c);
}
int main(void)
{
setlocale(LC_CTYPE, "");
wchar_t s1[100], s2[100];
wscanf(L"%ls", s1), wscanf(L"%ls", s2);
int n1 = wcslen(s1), n2 = wcslen(s2);
int d[2][100], *a = d[0], *b = d[1], *t;
for (int j = 0; j <= n2; j++) a[j] = j;
for (int i = 0; i < n1; i++) {
b[0] = i + 1;
for (int j = 0; j < n2; j++)
b[j+1] = min(a[j+1] + 1, b[j] + 1, a[j] + (s1[i] != s2[j]));
t = a, a = b, b = t;
}
printf("編集距離は %d です\n", a[n2]);
}
まだ解決にならないのでしょうか?
int d[100][100]; ですが、表を上から順番に作っていくので、
ある行と、その次の行の二つの行だけでできます。
[code=c]
#include <stdio.h> // printf
#include <wchar.h> // wcslen, wscanf
#include <locale.h> // setlocale
int min(int a, int b, int c)
{
return a < b ? (a < c ? a : c) : (b < c ? b : c);
}
int main(void)
{
setlocale(LC_CTYPE, "");
wchar_t s1[100], s2[100];
wscanf(L"%ls", s1), wscanf(L"%ls", s2);
int n1 = wcslen(s1), n2 = wcslen(s2);
int d[2][100], *a = d[0], *b = d[1], *t;
for (int j = 0; j <= n2; j++) a[j] = j;
for (int i = 0; i < n1; i++) {
b[0] = i + 1;
for (int j = 0; j < n2; j++)
b[j+1] = min(a[j+1] + 1, b[j] + 1, a[j] + (s1[i] != s2[j]));
t = a, a = b, b = t;
}
printf("編集距離は %d です\n", a[n2]);
}
[/code]