分析
首先设状态 d p x , 0 dp_{x,0} dpx,0 表示第 x x x 天持有美元的最大收益, d p x , 1 dp_{x,1} dpx,1 表示第 x x x 天持有马克的最大收益。
转移时跟昨天该种货币的最大收益和昨天另一种货币的最大收益换算成该种货币的最大收益去最大值即可,注意最后要转成美元。
代码
#include <bits/stdc++.h>
#define debug puts("Y")
#define inf INT_MAX
using namespace std;
const int N = 5 * 1e5 + 5;
int n;
double a[N], dp[N][5];
double change(int i, int ty){//ty为1表示将马克转成美元,为2表示美元转成马克
return (ty == 1 ? dp[i - 1][1] / a[i] * 100 : dp[i - 1][0] * a[i] / 100);
}
int main() {
cin >> n;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
}
dp[1][0] = 100, dp[1][1] = a[1];
for (int i = 2; i <= n; i ++) {
dp[i][0] = max(dp[i - 1][0], change(i, 1));
dp[i][1] = max(dp[i - 1][1], change(i, 2));
}
cout << fixed << setprecision(2) << max(dp[n][0], change(n, 1));
return 0;
}