Bytelandian金币每次错误回答

时间:2014-11-27 09:59:50

标签: c++ algorithm dynamic-programming

请帮助我找出为什么我得到错误的答案Bytelandian gold coins这个问题。 这是我的解决方案COINS

#include <iostream>
#include <cstdio>
#include <map>

#define max2(a, b) ((a) > (b) ? (a) : (b))

using namespace std;

map <long long , long long > C;

long long f(long long n)
{
    if (n == 0) return 0;

    long long r = C[n];

    if (r == 0) 
    {
         r = max2( n , f(n/2)+f(n/3)+f(n/4) );
         C[n] = r;
    }

    return r;
}

int main()
{
    int t;
    long long n;

    scanf("%d",&t);
    while(t--){
        scanf("%lld",&n);
        printf("%lld\n",f(n));
    }
    return 0;
}

我是动态编程的新手,所以我谷歌这个问题,我正在尝试实施 来自SPOJ_Coins
但仍然在codechef.com和spoj上得到错误答案。

1 个答案:

答案 0 :(得分:2)

对于此问题,您必须输入直到EOF。但是您正在使用测试用例进行输入。

试试这段代码:

#include <iostream>
#include <cstdio>
#include <map>

#define max2(a, b) ((a) > (b) ? (a) : (b))

using namespace std;

map <long long , long long > C;

long long f(long long n)
{
  if (n == 0) return 0;

  long long r = C[n];

  if (r == 0)
  {
    r = max2( n , f(n/2)+f(n/3)+f(n/4) );
    C[n] = r;
  }

  return r;
}

int main()
{
    // freopen("input.txt","r",stdin);
    // freopen("output.txt","w",stdout);

    int t;
    long long n;
    {
        while(scanf("%lld",&n)==1)
        {
            printf("%lld\n",f(n));
        }
    }
    return 0;
}