蚂蚁金服笔试题 0929

题目

小红准备进行一番基金操作来赚钱,她找到了一支基金,准备对这支基金进行一些操作。已知该基金每天的价格都会变化,小红每天可以花费当天的价格买入一笔基金,或者以当天的价格卖出一笔基金(前提是手上至少持有一笔基金)。小红有一个超能力,她可以直接预测到接下来的n天,每天基金价格的变化,但小红为了避免打草惊蛇,她的基金买卖有以下限制:每天最多买入/卖出一笔基金(例如手上如果有2笔基金,那么最多只能卖出1笔,另一笔只能等到以后再卖)。手上最多持有2笔基金。由于小红没有得知n天以后的情况,所以她计划在第n天时,手上为未持有基金的状态。小红想知道,自己在这n天中最多可以赚多少钱?假设小红的本金是足够多的,且初始状态是未购买基金。

输入描述

第一行输入一个正整数n,代表小红内幕消息得知的天数。

第二行输入n个正整数ai。代表第i天基金的价格。

1 ≤ n ≤ 100000

1 ≤ ai ≤ 10^9

输出描述

一个整数,代表最终小红能赚的最大钱数。

样例输入一

5

1 2 3 4 5

样例输出一

6

说明:第一天买入一笔,第二天买入一笔,第三天不操作,第四天卖出一笔,第五天卖出一笔,总共赚了6元。

样例输入二

4

4 2 3 1

样例输出二

1

说明:第一天不操作,第二天买入一笔,第三天卖出,第四天不操作。

以下是自己参考别人的思路,写的python代码。

j=0,当天不持有基金;j=1,当天持有一份基金;j=2,当天持有两份基金。

n = 6
prices = [1, 2, 3, 4, 5, 6]
# prices = [4, 2, 3, 1]

dp = [[0 for _ in range(3)] for _ in range(n)]

dp[0][1] = -prices[0] 
dp[0][2] = -1e7

for i in range(1, n):
    for j in range(3):
        if j == 0:
            dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])
            
        if j == 1:
            dp[i][1] = max(dp[i-1][1], dp[i-1][2] + prices[i], dp[i-1][0] - prices[i])
            
        if j == 2:
            dp[i][2] = max(dp[i-1][2], dp[i-1][1] - prices[i])
            
        
print(dp[n-1][0])  

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-24 20:55
阿里国际 Java工程师 2.7k*16.0
程序员猪皮:没有超过3k的,不太好选。春招再看看
点赞 评论 收藏
分享
在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务