【问题标题】:Bytelandian gold coins比特大陆金币
【发布时间】:2015-07-25 00:10:08
【问题描述】:

我正在解决这个问题 -> http://www.spoj.com/problems/COINS/ 。一个非常简单的 DP 问题,使用非常直接的 DP 方法。我在问题陈述中找到了足够的提示来使用 DP。所有测试用例都在我的编译器中完美运行,但我在 SPOJ 中获得了 WA。我的代码如下:

我的代码

#include <cstdio>
#include <map>
#include <cstring>
#include<algorithm>
using namespace std;
map< long long,long long > data;
map < long long,long long> :: iterator p;
int max(int a,int b)
{
    if(a>b)return a;
        return b;
}
long long calc(int n)
{
    long long c;
    if(n==0 || n==1 || n==2)
        return n;
p = data.find(n);
 if(p==data.end())
 {
    c = max(n, calc(n/2) + calc(n/3) + calc(n/4));
            data.insert(p, pair < long long, long long > (n, c));
            return c;
 }
else return (*p).second;

}
int main()
{
    int t;
    long long n;
    scanf("%d",&t);
    if(t>10)return 0;
    while(t--)
    {
        scanf("%lld",&n);
        if(n<0 || n>1000000000)
            break;
        data.clear();
        printf("%lld",calc(n));
    }
    return 0;
 }

我发现我真的很难弄清楚我哪里出错了!

与我的代码相矛盾的测试用例也可以。

【问题讨论】:

  • @PersonWhoDownvoted - 感谢您的关注。但是,如果问题的任何部分不清楚,请告诉我。我想纠正它。

标签: c++ recursion dynamic-programming


【解决方案1】:

可能是calculate 中的堆栈溢出。递归正在杀死你的程序:-)

或者只是calculate(1000000000)太慢了。

【讨论】:

  • 不......但我认为你可以优化一点。你知道calculate(n / 2) > calculate(n / 3) > calculate(n / 4),所以如果calculate(2) = n...
  • 另外一点,calculate(n)计算c(n/2)和c(n/4),但是c(n/2)计算c((n/2)/2)。是否可重用(即使考虑截断小数的 / 运算符)
  • @Daggerhunt 是的,即使在 C# 中,它也会在我的 PC 上瞬间完成。你可以使用这样的东西:pokristensson.com/strmap.html。地图是 SPOJ 中的基本工具。我要补充一点,如果您通过 C++ 尝试 SPOJ 可能会更好,因为 C++ 具有更丰富的基础库。 C# 不好(我在 C# 中做了各种 SPOJ),因为它们的 runner 在 C# 的初始加载中太慢了。
  • @Daggerhunt SPOJ 中的错误非常随机。可悲的是:-)
  • @Daggerhunt 其中一个回复谈到了溢出问题。尝试使用long long int
【解决方案2】:

使用动态编程,将结果存储在数组中。由于该值可以达到 10^9,并且您不能获取该大小的数组,因此只需将大小数组获取到 10^6 并存储它们的结果并使用简单递归计算剩余值。

【讨论】:

    【解决方案3】:

    这是python中的解决方案

    import sys
    mydict = {}
    def count(n):
        if n <= 5:
            return n
        elif n in mydict.keys():
            return mydict[n]
        else:
            k=max(n,count(n / 2) + count(n / 3) + count(n / 4))
            mydict[n]=k
            return mydict[n]
    
    for line in sys.stdin:
        res = count(int(line))
        print(int(res))
    

    【讨论】:

      【解决方案4】:

      这是我的解决方案,使用 dp :

      #include<bits/stdc++.h>
      using namespace std;
      map<long long int,long long int> m;
      long long int dp(long long int k){
          long long int a;
          if(k==0){
              return 0;
          }
          a=m[k];
          /* if(k<12){
              return k;
          } */
          if(k<12){
              return k;
          }       
          else if(a==0){  
              a=max(k,dp(k/2)+dp(k/4)+dp(k/3));
              m[k]=a;         
          }
          return a;   
      
      }
      int main(){
          long long int n,t;
          while(scanf("%lld",&n)>0){
              t=dp(n);
              cout << t << endl;
          }
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-19
        • 1970-01-01
        • 2019-05-16
        • 1970-01-01
        • 2019-12-04
        • 2020-02-18
        • 2023-04-09
        相关资源
        最近更新 更多