0

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

4 回答 4

2

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

于 2013-11-17T11:03:45.657 回答
2

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

calculate(1000000000)或者只是太慢的事实。

于 2013-08-12T15:44:47.703 回答
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))
于 2014-11-08T18:39:01.593 回答
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;
}
于 2015-07-24T16:04:09.893 回答