Я решаю хорошо известную проблему «Редактировать динамическое программирование расстояний». На самом деле проблема состоит из двух строк 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;
}
Правильно, потому что ваш 100000 * 100000
Массив 32-битных целых занимает 40 гигабайт памяти.
Вам нужно использовать другой алгоритм. Если вам нужно только вычислить расстояние редактирования до определенного максимума k
, есть модифицированная версия классического алгоритма, который использует только O(n * (2k + 1))
хранение (где n
длина строки), потому что она использует только середину 2k + 1
диагонали матрицы динамического программирования.