2 条题解
-
-2
一个非常好想的dp,脑子都不用动一下
每一个时刻拥有的钱和股票肯定越多越好!
所以设
f[i][0]为 第 天最多的股票,f[i][1]为 第 天最多的钱,显然,
f[0][0]=0, f[0][1]=1考虑到有可以买卖和什么都不干,于是有:
f[i][0] = max(f[i-1][0], f[i-1][1]/a[i])这是买股票f[i][1] = max(f[i-1][1], f[i-1][0]*a[i])这是卖股票于是有一个能过的代码:
#include<iostream> #include<cstdio> using namespace std; int n; double a,f[100005][2]; int main(){ scanf("%d",&n); f[0][0]=0; f[0][1]=1; for (int i=1;i<=n;i++){ scanf("%lf",&a); f[i][0]=max(f[i-1][0], f[i-1][1]/a) f[i][1]=max(f[i-1][1], f[i-1][0]*a) } printf("%.1lf",f[n][1]); return 0; }可以用滚动数组优化,有:
#include<iostream> #include<cstdio> using namespace std; int n; double a,f[2][2]; int main(){ scanf("%d",&n); f[0][0]=0; f[0][1]=1; for (int i=1;i<=n;i++){ scanf("%lf",&a); f[i&1][0]=max(f[(i&1)^1][0], f[(i&1)^1][1]/a); f[i&1][1]=max(f[(i&1)^1][1], f[(i&1)^1][0]*a); } printf("%.1lf",f[n&1][1]); return 0; }更快了
信息
- ID
- 310
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 15
- 已通过
- 10
- 上传者