1092: 最大价值(dollars) 算法 动态规划

题目地址:http://www.hustoj.com/oj/problem.php?id=1092

题目描述

Dave以某种方法获取了未来几天美元对德国马克的兑换率。现在Dave只有100美元,请编程序,使Dave通过几天的美元与德国马克的兑换后能得到最多的美元。

输入

第1行包含一个自然数n(l≤n≤I00),表示Dave所知道的兑换率的天数。
后面跟着n个自然数A (100≤A≤I000)。第i+l行的数A表示第i天的兑换率。它告诉那天他能用100美元购买A马克,或用A马克购买100美元。

输出

只有1行,输出Dave经过n天的兑换后能得到的最多的美元值。结果保留两位小数。注意不一定每天都需要兑换。
说明:由于实数运算存在误差,结果在0.05的误差范围内将被认为是正确的。

样例输入

3
100
150
200
5
400
300
500
300
250

样例输出

200.00 //用力错误,正常输出应该是100
266.66

提示

样例2说明:

第一天:100美元换成400德国马克

第二天:400德国马克换成133.3333美元

第三天:133.3333美元换成666.6666德国马克

第四天:不换

第五天:666.6666德国马克换成266.6666美元

解题思路:

使用动态规划记录每一天的历史的最大价值,然后最后根据历史价值求解!

package com.daxin;

import java.util.Arrays;
import java.util.Scanner;

/**
 * Created by Daxin on 2017/8/20.
 * 动态规划
 */
public class MaxDollarValue {
    public static void main(String[] args) {

//        Scanner cin = new Scanner(System.in);
//        int n = cin.nextInt();
//
//        int[] nums = new int[n];
//
//        for (int i = 0; i < n; i++) {
//            nums[i] = cin.nextInt();
//        }
        int[] nums = {400, 300, 500, 300, 250};
//        int[] nums2 = {100, 150, 200};
//        System.out.println(getMaxValue(nums1));
        System.out.println(getMaxValue(nums));

    }

    public static double getMaxValue(int[] nums) {
        int len = nums.length;
        double[][] table = new double[len][len + 1];//
        table[0][1] = 1;
        for (int i = 0; i < table.length; i++) {

            table[i][0] = nums[i];
        }

        for (int i = 2; i < table[0].length; i++) {

            for (int j = 1; j < table.length; j++) {

                double noChange = table[j - 1][i - 1];

                double change = noChange * nums[j - 1] * 1.0 / nums[j];

                table[j][i] = noChange > change ? noChange : change;

            }

        }

        for(double []ds :table){
            System.out.println(Arrays.toString(ds));

        }

        return Math.floor(table[table.length - 1][table[0].length - 1] * 10000) / 100;
    }

}

  

时间: 2024-10-10 10:43:47

1092: 最大价值(dollars) 算法 动态规划的相关文章

五大算法—动态规划

大常用算法之二:动态规划算法 一.基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移.一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划. 二.基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息.在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解.依次解决各子问题,最后一个子问题就是初

oj算法----动态规划----背包问题

oj算法----动态规划----背包问题 1.动态规划 1.1概念 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法 1.2性质 动态规划一般用来处理最优解的问题.使用动态规划算法思想解决的问题一般具有最优子结构性质和重叠子问题这两个因素. <1> 最优子结构 一个问题的最优解包含其子问题的最优解,这个性质被称为最优子结构性质 <2> 重叠子问题 递归算法求解问题时,每次产生的子问题并不总是新问

算法——动态规划篇——最长公共子序列

问题描述      最长公共子序列,英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列.       解决最长公共子序列,一种常用的办法,就是穷举法,组合出所有的情况,但是这样对于长序列的情况来说,是非常不实际.. 假设现在有两个序列,x[]={'A','B','C','B','D','A','B'};y[]={'B','D','C','A'

算法——动态规划篇——斐波那契数列

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1960年代起出版了<斐波纳契数列>季刊,专门刊载这方面的研究成果. 以上内容来自百度百科.. 今天主要是想用动态规划的思想求解斐波那契数列,用来观察动态规划带来的优势,空间换时间,不重复求解

数据结构与算法 -- 动态规划算法

1.0-1背包问题 //0-1背包问题--动态规划算法 public class DynamicPlan { public static void main(String[] args) { DynamicPlan dynamicplan = new DynamicPlan(); int[] weight = {1, 2, 3, 4, 5}; System.out.println("方法一 背包所装物品的重量为:" + dynamicplan.knapsack(weight, weig

最好懂得贪心算法+动态规划之数塔问题

1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 const int N=100; 5 int tower[N][N],f[N][N]={0},n; 6 void upMax(int &a,const int &b){ 7 a=(a>b?a:b); 8 } 9 int main(){ 10 cin>>n; 11 for(int i=1;i<=n;i++){ 12 f

js 高级算法 - 动态规划

主要是看了<数据结构与算法>有所感悟,虽然这本书被挺多人诟病的,说这有漏洞那有漏洞,但并不妨碍我们从中学习知识. 其实像在我们前端的开发中,用到的高级算法并不多,大部分情况if语句,for语句,swith语句等等,就可以解决了.稍微复杂的,可能会想到用递归去的解决. 但要注意的是递归写起来简洁,但实际上执行的效率并不高. 我们再看看动态规划的算法: 动态规划解决方案从底部开始解决问题, 将所有小问题解决掉, 然后合并成一个整体解决方案, 从而解决掉整个大问题 . 实例举例  (计算斐波那契数列

经典中的经典算法 动态规划(详细解释,从入门到实践,逐步讲解)

动态规划的重要性就不多说,直接进入正题 首先,我们看一下官方定义: 定义: 动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决. 动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息.在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解.依次解决各子问题,最后一个子问题就是初始问题的解. 基本思想与策略编

干货:图解算法——动态规划系列

小浩:宜信科技中心攻城狮一枚,热爱算法,热爱学习,不拘泥于枯燥编程代码,更喜欢用轻松方式把问题简单阐述,希望喜欢的小伙伴可以多多关注! 动态规划系列一:爬楼梯 1.1 概念讲解 讲解动态规划的资料很多,官方的定义是指把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解.概念中的各阶段之间的关系,其实指的就是状态转移方程.很多人觉得DP难(下文统称动态规划为DP),根本原因是因为DP区别于一些固定形式的算法(比如DFS.二分法.KMP),没有实际的步骤规定第一步第二步来做什么,所以准