FOJ/FZU/FZOJ 1550Monetary System【记忆化搜索】

原创 2016年04月11日 22:24:14

Problem 1500 Monetary System

Accept: 415    Submit: 1261
Time Limit: 1000 mSec    Memory Limit : 32768 KB

Problem Description

In Byteland they have a very strange monetary system.

Each Bytelandian gold coin has an integer number written on it. A coin n can be exchanged in a bank into three coins: n/2, n/3 and n/4. But these numbers are all rounded down (the banks have to make a profit).

You can also sell Bytelandian coins for American dollars. The exchange rate is 1:1. But you can not buy Bytelandian coins.

You have one gold coin. What is the maximum amount of American dollars you can get for it?

Input

The input will contain several test cases (not more than 10). Each testcase is a single line with a number n, 0 <= n <= 1000000000. It is the number written on your coin.

Output

For each test case output a single line, containing the maximum amount of American dollars you can make.

Sample Input

12
2

Sample Output

13
2

Source

FOJ月赛-2007年5月 

题目大意:给你一个特殊的硬币,这个硬币可以换三种硬币:n/2,n/3,n/4,问怎么换能够得到最大硬币价值,翻译的可能有些浅显,我们就样例1来说:
n=12 当n只换一次为: 6 4 3的时候就比价值12大1为13,当然6也可以继续向下兑换,但是因为我们是举例,就不向下分了。

分析:搜索。因为N比较大的时候,暴搜一定会超时,这个时候我们就要想优化的方法。


我们知道,如果输入的n比较大的时候,在深搜的过程中记录一些可能会重复的值就可以省略掉很多很多不需要的操作,因为数组开的大小有限,所以我们只对10^6以下的数据进行记忆化,其他数据我们还是暴力处理。


爆搜输入999999999的时候跑的时间就要取决于你的电脑cpu强大与否了..................... 但是经过处理一些重复数据之后,是用很快的速度就能跑出来的。


需要注意的点:数据要开long long int,千万记住FZU要使用I64d,不能用lld。。。。。。。在wa了一次之后改数据为long long int的时候竟然TLE...........后来才知道要交I64d......好坑爹................【论我们学校oj和别的学校oj后台处理方式不同的坑爹性....................】

AC代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define ll __int64
ll output;
ll dp[1000000];//只处理10^6以下的数据记忆化,其实数据越小,越需要记忆化,反而值越大,越不需要记忆化,10^6足够了。
ll dfs(ll now)
{
    if(now==0)return 0;
    if(now<=1000000)
    {
        if(dp[now]!=0)return dp[now];
        else
        {
            dp[now]=max(now,dfs(now/2)+dfs(now/3)+dfs(now/4));
            return dp[now];
        }
    }
    else
    {
        return max(now,dfs(now/2)+dfs(now/3)+dfs(now/4));
    }
}
int main()
{
    ll n;
    while(~scanf("%I64d",&n))
    {
        memset(dp,0,sizeof(dp));
        output=dfs(n);
        printf("%I64d\n",output);
    }
}













版权声明:0.0小白有写的不好不对的地方请指出~

FZU 2092 收集水晶(记忆化搜索)

FZU 2092 收集水晶(记忆化搜索)
  • Dacc123
  • Dacc123
  • 2016年03月09日 08:51
  • 144

[ACM] FZU 2092 收集水晶 (DFS,记忆化搜索)

Problem Description shadow来到一片神奇的土地,这片土地上不时会出现一些有价值的水晶,shadow想要收集一些水晶带回去,但是这项任务太繁杂了,于是shadow让自己...

fzu 2092 收集水晶(记忆化搜索(dp),dfs)(也可以用bfs)

dp与其说是一种算法,不如说是一种思想。 而记忆化搜索运用了这种思想,即记忆化搜索的实质是dp。它结合了dp与搜索的优点,在搜索的基础上记录每个状态“是否已经计算过”,以此提高效率。 一般说来,d...

FZU 2156(记忆化搜索)

Problem 2156 Climb Stairs Accept: 153    Submit: 397 Time Limit: 1000 mSec    Memory Limit : 327...

FZU 1500 Monetary System(深搜+打表)

Problem 1500 Monetary System Accept: 417 Submit: 1263 Time Limit: 1000 mSec Memory Limit : 3...

POJ 1958 Strange Towers of Hanoi (四塔问题,线性dp,记忆化搜索)

题目分析:四柱汉诺塔。由于题目已经给出了求解方法,直接写代码即可。下面总结一下,四塔问题。 感谢这篇文章的作者,点这里就到,总结的很好。直接贴过来~ 四塔问题:设有A,B,C,D四个柱子(有时称塔),...

记忆化搜索之二:集合上的动态规划,最优配对问题

题目出自《算法竞赛入门经典》动态规划那一章 大意:空间里有n个点P0,P1,…,Pn-1,你的任务是把它们配成n/2对(n是偶数),使得每个点恰好在一个点对中。所有点对中两点的距离之和应尽量小。 ...

nyoj 10 skiing 记忆化搜索

本来毫无计划,不知道刷什么题,好多算法都是只知道一点点,入门级别,本来是要刷一道双线dp题,结果学长说我们自己oj就有这道题,唉~自己oj的题都没透,还想去别的oj。。。。。 之前做了一道记忆化搜索...
  • AcmLzq
  • AcmLzq
  • 2016年05月12日 23:44
  • 514
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:FOJ/FZU/FZOJ 1550Monetary System【记忆化搜索】
举报原因:
原因补充:

(最多只允许输入30个字)