1. 程式人生 > >1092: 最大價值(dollars) 算法 動態規劃

1092: 最大價值(dollars) 算法 動態規劃

tint 程序 ret 每天 i++ hang 解題思路 ack 提示

題目地址: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美元

解題思路:

使用動態規劃記錄每一天的歷史的最大價值,然後最後根據歷史價值求解!

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 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; } }

  

1092: 最大價值(dollars) 算法 動態規劃