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 收集水晶(记忆化搜索(dp),dfs)(也可以用bfs)

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

FZU 1500 Monetary System(深搜+打表)

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

关于记忆化搜索

转载自:http://blog.csdn.net/urecvbnkuhbh_54245df/article/details/5847876 记忆化搜索:   算法上依然是搜索的流程,但是搜索到的一些解...

hdoj1078 FatMouse and Cheese(记忆化搜索)

来源:http://acm.hdu.edu.cn/showproblem.php?pid=1078 一开始把最多走k步理解成每走一步有四种方向的选择,所以就思考把图转化为一个按奶酪数排序的一维数组 对...
  • CqZtw
  • CqZtw
  • 2017-06-11 17:41
  • 84

NOIP模拟题 2016.10.13 [贪心] [记忆化搜索]

T1: 题意: 给定一个操作序列,问这个数据结构可能是哪些? 模拟即可。记得判空!!因为可能是不知名的神奇数据结构。#include #include #include #include #in...

puk 1088 滑雪(记忆化搜索)

原文地址点击打开链接  http://acm.pku.edu.cn/JudgeOnline/problem?id=1088 非常经典的一道动态规划题,AC的时候心情简直舒畅到了极点. ...

hdu1978 How many ways--DP/记忆化搜索DFS

原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=1978 一:原题内容 Problem Description 这是一个简单的生存游戏,你控制...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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