背景
又是一道水题
描述
在某个神秘的星球上有一种货币,它有一种奇怪的兑换规则
你有且仅有一枚面值为n的金币,你可以去银行进行兑换,也可以不兑换
如果去银行兑换,兑换的规则是这样的:用面值为a的金币去兑换可以换到a/2,a/3,a/4这三枚硬币(如果
是小数则截尾取整),你可以兑换多次
读入n
输出你最后最多能拥有的钱数w
每个测试点中有T组数据
格式
输入格式
一个数T表示该点的测试数据组数(1=<T<=20 )
下面跟着T行,每行一个整数n(0 <= n <= 1000000000 )
输出格式
输出T行(一一对应)
每行一个整数就是你最后最多拥有的钱数w
限制
各个测试点3s
提示
小心数据较大,但是不需要高精度
来源
源于spoj;
思路:记忆化搜索;
按照正常的递推是:dp[i]=max(i,dp[i/2]+dp[i/3]+dp[i/2]);
由于给的范围很大,所以不能开那么大的数组。
所以我们记忆化搜索就行:dp[i]=max(i,dp[i/2]+dp[i/3]+dp[i/2]);
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<stdlib.h> 5 #include<string.h> 6 #include<math.h> 7 #include<queue> 8 #include<map> 9 using namespace std; 10 typedef long long LL; 11 map<LL,LL>my; 12 LL N=1; 13 LL maxx[1000000]; 14 LL dfs(LL n); 15 int main(void) 16 { 17 int i,j,k; 18 scanf("%d",&k); 19 LL n,m; 20 while(k--) 21 { 22 scanf("%lld",&n); 23 printf("%lld\n",dfs(n)); 24 } 25 return 0; 26 } 27 LL dfs(LL n) 28 { 29 if(my[n]==0) 30 { 31 my[n]=N++; 32 } 33 else return maxx[my[n]]; 34 maxx[my[n]]=n; 35 if(n<=4) 36 { 37 return n; 38 } 39 maxx[my[n]]=max(maxx[my[n]],dfs(n/2)+dfs(n/3)+dfs(n/4)); 40 return maxx[my[n]]; 41 }