题目地址: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;    }} | 
原文:http://www.cnblogs.com/wangsicongde/p/7576887.html