题目描述
在以后的若干天里戴维将学习美元与德国马克的汇率。编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值。
输入
输入第一行是一个自然数N,1≤N≤100,表示戴维学习汇率的天数。
接下来的N行中每行是一个自然数A,1≤A≤1000。第i+1行的A表示预先知道的第i+1天的平均汇率,在这一天中,戴维既能用100美元买A马克也能用A马克购买100美元。
输出
输出第一行也是唯一的一行应输出要求的钱数(单位为美元,保留两位小数)。
注意:考虑到实数算术运算中进位的误差,结果在正确结果0.05美元范围内的被认为是正确的,戴维必须在最后一天结束之前将他的钱都换成美元。
样例输入
5 400 300 500 300 250
样例输出
266.66
提示
Day 1 ... changing 100.0000 美元= 400.0000 马克
Day 2 ... changing 400.0000 马克= 133.3333 美元
Day 3 ... changing 133.3333 美元= 666.6666 马克
Day 5 ... changing 666.6666 马克= 266.6666 美元
这道题为dp:
满足最优子结构(每天最优则最后最优)
无后效性(后一天只需根据前一天的美元或马克兑换)
决策:
每一天手中的钱只有两种情况:
从前一天直接继承或者兑换钱
所以只要选择其中更优的一种即可
code:
#include <bits/stdc++.h>
using namespace std;
int n,i,a;
double d[110]={0,100},m[110];
//d数组存储美元,m数组存储马克
int main()
{ scanf("%d",&n);//输入天数
cin>>m[1];//第一天的兑换值
for(i=2;i<=n;i++){//循环天数
scanf("%d",&a);
d[i]=max(d[i-1],m[i-1]*100.0/a);
//最优美元就是前一天的美元和由前一天马克兑换后的美元中较大值
m[i]=max(m[i-1],d[i-1]*a/100.0);
//最优马克就是前一天马克的和由前一天美元兑换后的马克中较大值
}printf("%.2lf",d[n]);//输出第n天最大美元值
return 0;
}