P1599 货币

背景

又是一道水题

描述

在某个神秘的星球上有一种货币,它有一种奇怪的兑换规则
你有且仅有一枚面值为n的金币,你可以去银行进行兑换,也可以不兑换
如果去银行兑换,兑换的规则是这样的:用面值为a的金币去兑换可以换到a/2,a/3,a/4这三枚硬币(如果
是小数则截尾取整),你可以兑换多次
读入n
输出你最后最多能拥有的钱数w
每个测试点中有T组数据

格式

输入格式

一个数T表示该点的测试数据组数(1=<T<=20 )
下面跟着T行,每行一个整数n(0 <= n <= 1000000000 )

输出格式

输出T行(一一对应)
每行一个整数就是你最后最多拥有的钱数w

样例1

样例输入1[复制]

2
12
2

样例输出1[复制]

13
2

限制

各个测试点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 }

 

posted @ 2016-05-13 15:11  sCjTyC  阅读(238)  评论(0编辑  收藏  举报