我正在解决这个问题 - > 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;
}
我发现我很难弄明白我哪里错了!
与我的代码相矛盾的测试用例也可以。
答案 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;
}