【问题标题】:Byteland Coins Array SolutionByteland Coins Array 解决方案
【发布时间】:2015-12-23 11:44:36
【问题描述】:

我发现很难实现这个 SPOJ 问题:- http://www.spoj.com/problems/COINS/ 我找到了某人的代码,但它包含一个我希望用数组替换的映射函数。代码如下:-

#include <bits/stdc++.h>
using namespace std;
#define LL long long
map <LL,LL> ans; 

LL coins(LL n)
{
     if(n==0)
          return 0;
     else if(!ans[n])  //what does this condition check?
     {
          ans[n]= max(n,coins(n/2) + coins(n/3) + coins(n/4));
     }
     return ans[n];
}

int main() {
     LL n;
     while(scanf("%lld",&n)!=EOF)
     {
          printf("%lld\n",coins(n));
     }

     return 0;
}

【问题讨论】:

  • 那么,问题出在哪里?我在这里看不到实际的问题...除此之外,我猜如果您使用数组,它可能无法通过所有测试...
  • 如果您设法使用数组解决此问题,请告诉我...

标签: c++ arrays dynamic-programming


【解决方案1】:

如果你想使用数组,那么你最好使用向量。 在上面的代码中声明vector来保存n的值,并用0初始化,

vector<LL> v(n, 0);

关于在代码中检查什么条件只是我们是否找到n硬币的答案,因为默认情况下ans[n]将包含0(但这不是访问地图中第n个元素的好方法不包含 n 个值)。

【讨论】:

    【解决方案2】:

    只需使用类似的东西(并且尽可能避免使用#define):

    typedef ll_type long long;
    const size_t max_size = //...
    ll_type ans[max_size];
    

    【讨论】:

    • 祝你好运:n 。除此之外,你可能应该初始化你的数组,如果你想检查!ans[n]
    • @dingalapadum 你是对的!因此,我们最好使用向量并在声明处对其进行初始化。
    • @pravar :但即使您使用向量:假设 long long 在该机器上是 64 位,具有 1 000 000 000 个条目的向量将使用 2GB。而且大多数条目甚至都不会被使用......在第一个地方使用数组来解决这类问题只是一个坏主意......但是是的,if 你要去使用数组/向量,然后初始化那些 2GB 是强制性的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2012-03-31
    • 2013-07-22
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多