2 条题解

  • -2
    @ 2025-7-4 14:12:45

    一个非常好想的dp,脑子都不用动一下

    每一个时刻拥有的钱和股票肯定越多越好!

    所以设 f[i][0] 为 第 ii 天最多的股票,f[i][1] 为 第 ii 天最多的钱,

    显然,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
    上传者