腾讯2022.4.25笔试压轴题

目录 

题目

输入

输出

示例

思路

代码


题目

现在有一个长度为n的价格数组a,表示某只股票每天的价格,你每天做多买入或卖出该只股票的1手股票,买入或者卖出没有手续费,且卖出股票前必须手里已经有股票才能卖出,但是持有的股票数目不受限制,并且初始资金为m元。你再任意时刻都不能进行透支,所以你的资金必须始终大于等于0,请问你在n天结束之后,拥有的最大总资产是多少?(总资产:股票数目*股票价格+现金)

输入

第一行两个整数n,m(1<=n<=2000,1<=m)

第二行n个正整数a(n)(1<=a[n]),其中a(i)表示股票在第i天的售价

输出

输出n天结束后,拥有的最大总资产

示例

输入

n = 6 , m = 2

a[n] = [ 2 3 1 1 1 2 ]

输出

max = 6

输入

n = 3, m = 2

a[n] = [ 1 1 4 ]

输出

max = 8

思路

代码

public class TestDemo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //输入n为天数
        int n = sc.nextInt();
        //输入m为初始资金
        int m = sc.nextInt();
        //输入数组a为每一天的股票价格
        int[] a = new int[n];
        for(int i=0;i<n;++i){
            a[i]=sc.nextInt();
        }
        //定义状态数组
        int[][] ret = new int[n][n+1];
        //设置初始状态
        if(m>=a[0])
            ret[0][1] = m-a[0]+a[n-1];
        else
            ret[0][1] = -1;
        ret[0][0] = m;
        //状态转移
        for(int i =1;i<n;i++){
            //因为股票数不可能大于天数,所以j<=i+1,并且不能大于总股票数,所以j<n
            for(int j = 0;j<=i+1 && j<n;j++){
                //能不能卖
                int a1;
                if(ret[i-1][j+1]!=-1)
                    a1 = a[i]-a[n-1] +ret[i-1][j+1];
                else
                    a1 = -1;
                //能不能买
                int b1;
                if(j>0 && ret[i-1][j-1]-(j-1)*a[n-1] >= a[i])
                    b1 = a[n-1]-a[i] +ret[i-1][j-1];
                else
                    b1 = -1;
                //不买不卖
                int c1 = ret[i-1][j];
                ret[i][j] = Math.max(a1,Math.max(b1,c1));
            }
        }
        //返回结果
        int max = 0;
        for(int j=0;j<n;++j){
            max=Math.max(ret[n-1][j],max);
        }
        System.out.println(max);
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值