Bytelandian金币

时间:2013-08-12 15:42:18

标签: c++ recursion dynamic-programming

我正在解决这个问题 - > 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;
 }

我发现我很难弄明白我哪里错了!

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

4 个答案:

答案 0 :(得分:2)

也许calculate中的堆栈溢出。递归会杀死你的程序: - )

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

这是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))

答案 3 :(得分:1)

这是我的解决方案,使用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;
}