kavinderrana121 Ответов: 1

Альтернативный способ объявления большого массива в куче


Я пытался решить вопрос о базовой рекурсии с помощью запоминания https://www.spoj.com/problems/COINS/

Примечание-> максимальное значение n составляет 1 000 000 0000

Я определенно должна добавить мемоизация решить эту проблему
Но когда я объявляю массив размером `1 000 000 000` компилятор говорит std::bad_alloc
Если я не объявляю этот большой размер, чем очень большой, почти равный 100000000(больше размера массива), то я получаю ошибку сегментации

ну некоторые люди рекомендовали мне использовать карту ,в карту также мы должны вставить все свои данные.
ключ и присвоить значение -1
в противном случае когда рекурсия начнется как для некоторых очень больших как мы можем сопоставить возвращаемое значение которое до сих пор не хранится в качестве ключа

Может ли кто-нибудь помочь, как карта будет работать здесь, чтобы оптимизировать сложность пространства в этом случае ?

Что я уже пробовал:

#include<bits/stdc++.h>
using namespace std;
vector <int> dp(100000,-1);
int exchange(int n){
    if(n<12)
        return n;
    if(dp[n]!=-1)
        return dp[n];
    return dp[n] = exchange(n/2)+exchange(n/3)+exchange(n/4);
}
int main(){
 //   int t;
   // cin>>t;
    while(1){
  //      memset(dp,-1,sizeof(dp));
        int n;
        cin>>n;
        cout<<exchange(n)<<endl;
    }

}

1 Ответов

Рейтинг:
0

Patrice T

Цитата:
Но когда я объявляю массив размером `1 000 000 000` компилятор говорит std::bad_alloc

Ваша проблема заключается в том, что вы не проанализировали проблему, вы прыгаете прямо ко второму самому простому решению, которое заменило решение грубой силы другим решением грубой силы, другим способом.
Подумайте об этом, если n= 1 000 000 000, то самое большое меньшее значение, которое вы когда-либо использовали, - это 500 000 000. Ни одно значение между этими двумя значениями никогда не будет использовано для решения проблемы.
Простое каскадирование уменьшения n/2 даст вам 30 значений в худшем случае.
Вы должны найти способ избежать объявления 1 000 000 000 значений в массиве или что-то еще.


kavinderrana121

Как вы рассчитали общую уникальную подзадачу в этом случае

Patrice T

1 000 000 000 - это < 2^30, поэтому многократное деление на 2 не должно превышать 30 раз.