动态规划做题日记 (day 1)

—l2021-12-05l—

1014. 最佳观光组合

time:12.4|am

题目描述

给你一个正整数数组 values,其中 values[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的 距离 为 j - i。

一对景点(i < j)组成的观光组合的得分为 values[i] + values[j] + i - j ,也就是景点的评分之和 减去 它们两者之间的距离。

返回一对观光景点能取得的最高分。

思路

将问题 values[i] + values[j] + i - j 分解为 values[i] + i 和 values[j] - j 即可

题解

  • 由于题目时间要求,所以需要对原本多重循环进行优化到O(n)
  • for循环中的顺序用于满足 j > i 这一条件
class Solution {
public:
    int maxScoreSightseeingPair(vector<int>& values) {
        int maxN=0;
        int n=values[0]+0;
        for(int i=1;i<values.size();i++){
            //以下顺序用于保证j>i
            maxN=max(maxN,values[i]-i+n);
            n=max(n,values[i]+i);
        }
        return maxN;
    }  
};

121. 买卖股票的最佳时机

time:12.4|am

题目描述

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

思路

第 i 天的最大利润 = max(之前最大利润,当天利润 - 之前某天最小利润)

题解

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int maxS=0,minS=prices[0];
        for(int i=0;i<prices.size();i++){
            if(prices[i]-minS>0) maxS=max(maxS,prices[i]-minS);
            minS=min(minS,prices[i]);
        }
        return maxS;
    }
};

122. 买卖股票的最佳时机 II

time:12.4|pm

题目描述

给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

思路

以动态规划思想:
求第 i 天卖出时的最大利润 = max ( 前天获取的最大利润 + ( 如果今天的钱 - 昨天的钱小于零 就是"",如果不是就是“今天的钱 - 昨天的钱” ), prices[i]-minN>0?prices[i]-minN:0 )

题解

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size()==1) return 0;
        int m=max(0,prices[1]-prices[0]),n=max(0,prices[1]-prices[0]),
            maxN=max(prices[1]-prices[0],0),minN=min(prices[0],prices[1]);
        for(int i=2;i<prices.size();i++){
            m=max(m+(prices[i]-prices[i-1]>0?prices[i]-prices[i-1]:0),
                prices[i]-minN>0?prices[i]-minN:0);
            minN=min(minN,prices[i]);
            maxN=max(m,n);
        }
        return maxN;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值