1092: 最大價值(dollars) 算法 動態規劃
阿新 • • 發佈:2017-09-22
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) 算法 動態規劃