[英]C++ vector and memoization runtime error issues
我遇到一個問題在這里的Codechef。 我正在嘗試使用向量進行記憶。 由於我仍然是編程新手,並且對STL容器不熟悉,因此我將vector
用於查找表。 (盡管有人建議我使用map
來解決問題)。
因此,我的問題是,下面給出的解決方案如何會遇到運行時錯誤。 為了得到錯誤,我使用問題的邊界值( 100000000
)作為輸入。 我的Netbeans IDE顯示的錯誤消息是RUN FAILED (exit value 1, total time: 4s)
,輸入為1000000000
。 這是代碼:
#include <iostream>
#include <cstdlib>
#include <vector>
#include <string>
#define LCM 12
#define MAXSIZE 100000000
using namespace std;
/*
*
*/
vector<unsigned long> lookup(MAXSIZE,0);
int solve(int n)
{
if ( n < 12) {
return n;
}
else {
if (n < MAXSIZE) {
if (lookup[n] != 0) {
return lookup[n];
}
}
int temp = solve(n/2)+solve(n/3)+solve(n/4);
if (temp >= lookup[n] ) {
lookup[n] = temp;
}
return lookup[n];
}
}
int main(int argc, char** argv) {
int t;
cin>>t;
int n;
n = solve(t);
if ( t >= n) {
cout<<t<<endl;
}
else {
cout<<n<<endl;
}
return 0;
}
我懷疑這是否是內存問題,因為他已經說過該程序實際上在運行,並且他輸入了100000000。
我注意到的一件事,在if條件下,即使n == MAXSIZE(在此精確條件下),您也要執行lookup [n]。 由於C ++使用索引為0的向量,因此該向量將比向量的末尾多1。
if (n < MAXSIZE) {
...
}
...
if (temp >= lookup[n] ) {
lookup[n] = temp;
}
return lookup[n];
我猜不出算法在做什么,但是我認為第一個“ if”的右括號應降低,並且您可能會在此邊界條件下返回錯誤。
您要么沒有足夠的內存,要么沒有足夠的連續地址空間來存儲100,000,000個unsigned long
s。
這主要是內存問題。 對於矢量,您需要連續的內存分配[以便可以跟上其恆定時間查找的承諾]。 對於您的情況,使用8字節的雙字節,您基本上是在要求您的計算機在單個塊中提供大約762 mb的內存。
我不知道您要解決哪個問題,但看起來您正在解決Bytelandian硬幣。 為此,最好使用地圖,因為:
因此,在您的情況下最好使用的是std :: map。 在您的情況下,實際上只需將std::vector<unsigned long>
替換為std::map<int, unsigned long>
,因為map
也具有[]
操作員訪問權限[在大多數情況下,應該如此]。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.