Редактирование динамического программирования расстояния для очень большого ввода

Я решаю хорошо известную проблему «Редактировать динамическое программирование расстояний». На самом деле проблема состоит из двух строк string1 и string2 и стоимости удаления, вставки и замены символа, мне нужно преобразовать string1 в string2 с минимальными затратами. Для DP I должны использовать двумерный массив. Для небольшой строки (размер<= 10000) мой код работает, но для большего ввода (размер> = 100000) компилятор говорит «размер массива слишком велик». Если проблема должна быть решена с помощью динамического программирования (для входного размера = 100000), пожалуйста, скажите мне, как я должен обработать эту ошибку. Вот мой код.

#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <algorithm>
#include <map>
#include <queue>
#include <iomanip>
#include <string>
#include <math.h>
#include <limits>
#include <map>
#include <float.h>
#include <limits.h>
#include <string.h>
using namespace std;
#define rep(i,a,N) for(int i=a;i<N;++i)
int DP[10000][10000],delete_cost,add_cost,replace_cost;
string first,second;
int Min(int x,int y,int z){
int min=x<y?x:y;
min=min<z?min:z;
return min;
}

int Transform(int i,int j){
if(DP[i][j]!=-1){
//printf("DP is set\n");
return DP[i][j];
}
if(i==first.size())
return (second.size()-j)*add_cost;
if(j==second.size())
return (first.size()-i)*delete_cost;
if(first.at(i)!=second.at(j)){
int add,del,rep;
add=Transform(i,j+1)+add_cost;
del=Transform(i+1,j)+delete_cost;
rep=Transform(i+1,j+1)+replace_cost;
return DP[i][j]=Min(add,del,rep);
}
else
return DP[i][j]=Transform(i+1,j+1);

}
int main(){
int T,a,b,k,ans;
scanf("%d",&T);

while(T--){
memset(DP,-1,sizeof(DP));
cin>>first;
cin>>second;
scanf("%d %d %d",&a,&b,&k);
add_cost=a;
delete_cost=b;
replace_cost=k;
//ans=Transform(0,0);
//if(ans<=k)
printf("%d\n",ans );
//else
//  printf("%d\n",-1);
}
return 0;
}

-2

Решение

Правильно, потому что ваш 100000 * 100000 Массив 32-битных целых занимает 40 гигабайт памяти.
Вам нужно использовать другой алгоритм. Если вам нужно только вычислить расстояние редактирования до определенного максимума k, есть модифицированная версия классического алгоритма, который использует только O(n * (2k + 1)) хранение (где n длина строки), потому что она использует только середину 2k + 1 диагонали матрицы динамического программирования.

0

Другие решения


По вопросам рекламы [email protected]