蓝桥杯动态规划第三弹-路径问题进阶2.0

这篇具有很好参考价值的文章主要介绍了蓝桥杯动态规划第三弹-路径问题进阶2.0。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、删除并获得点数

二、粉刷房子

三、买卖股票最佳时机

四、手续费的买卖股票


一、删除并获得点数

删除并且获得点数

蓝桥杯动态规划第三弹-路径问题进阶2.0,蓝桥杯,动态规划,职场和发展

(我觉得这个还是较为复杂一点的)

我是开始一点没有思路,然后放弃这个题了——后来发现他有一个重要的思路,我从来没有发现过的一个思路。

nums[1,1,2,2,4,4,5,8,8,8],首先他假如说给这个数组,他既不完整,又不规律,很不好处理

所以我们使用类似于哈希表那种

/\arr=[0,2,4,0,8,5,0,0,24],这个下标是依次对应的,

           0 1 2 3 4 5 6 7 8

 这样就可以让给的数据,变成我们心中想的那样规律了。同时还有一个问题,不知道大家看出来没有,就是相同元素其实可以选择合并,假如说三个8,那么他的遇到一个,把7和9都删除了,那么后面的8就可以直接加在上面。

1.状态表示:

dp[i]:到达i位置,获得的最大点数,细分为下面两种

f[i]到达i位置,处于“选择”能获得的最大点数。

g[i]到达i位置,处于“不选“能获得的最大点数。

2.状态转移方程

f[i]=g[i-1]+nums[i]

g[i]=max(f[i-1],g[i-1])

3.初始化

f[0]=nums[0]

4.填表顺序

从左到右

5.返回值

二、粉刷房子

刷房子

蓝桥杯动态规划第三弹-路径问题进阶2.0,蓝桥杯,动态规划,职场和发展

由题意得出,红色是0,绿色是2,那么蓝色就是1

1.状态表示

dp[i]:到达i位置,花费的最小金额

可以更加细分(我的思路这样,但是有些问题,所以我这种思路不是很好

f[i]:到达i位置,处于选择状态,花费的最小金额

g[i]:到达i位置,处于不能相同颜色状态,花费的最小金额

)

细分

dp[i][0]:粉刷到i位置,最后刷墙是红色,此时的最小花费

dp[i][1]:粉刷到i位置,最后刷墙是蓝色,此时的最小花费

dp[i][2]:粉刷到i位置,最后刷墙是绿色,此时的最小花费

2.状态转移方程

dp[i][0]=min(dp[i-1][1],dp[i-1][2])

dp[i][1]=min(dp[i-1][0],dp[i-1][2])

dp[i][2]=min(dp[i-1][0],dp[i-1][1])

3.初始化

dp[0][0]=cost[0][0]

dp[0][1]=cost[0][1]

dp[0][2]=cost[0][2]

4.填表顺序

从左到右,三个表一个写

5.返回值

返回三个dp表结尾中的最小值

return min(dp[][],dp[][],dp[][])

class Solution {
    public int minCost(int[][] costs) {
    int m=costs.length,n=costs[0].length;
    int[][]dp=new int[m][n];

    dp[0][0]=costs[0][0];
    dp[0][1]=costs[0][1];
    dp[0][2]=costs[0][2];

    for(int i=1;i<m;i++){
    dp[i][0]=Math.min(dp[i-1][1],dp[i-1][2])+costs[i][0];
    dp[i][1]=Math.min(dp[i-1][0],dp[i-1][2])+costs[i][1];
    dp[i][2]=Math.min(dp[i-1][0],dp[i-1][1])+costs[i][2];
    }
      return Math.min(dp[m-1][0],Math.min(dp[m-1][1],dp[m-1][2]));
    }
}

三、买卖股票最佳时机

买卖股票

蓝桥杯动态规划第三弹-路径问题进阶2.0,蓝桥杯,动态规划,职场和发展

1.状态表示

dp[i]:到达i位置,股票的最大利润

但是我们可以进行具体的细分

f[i]:第i天的时候,买入后但没有进行别的操作的状态(未卖出,手里有股票)状态的最大利润(这里你思考一下,这个卖出状态和处于冷冻期状态,有没有必要去把这两个状态更细化的区分。)

t[i]:第i天的时候,股票处于冷冻期状态

g[i]:第i天的时候,股票处于股票处于冷冻期结束,没买但是可以买的状态(手里面没股票,要去买)的最大利润

2.状态转移方程

f[i]=Math.max(f[i-1],g[i-1]-prices[i])

t[i]=f[i-1]+prices[i]

g[i]=Math.max(f[i-1],t[i-1])

3.初始化

f[0]为买入之后,所以直接赋值为-prices[0]

4.填表顺序

从左到右,三个表一个填写

5.返回值

return 三个表最大即可

class Solution {
    public int maxProfit(int[] prices) {
      int m=prices.length;
      int []f=new int[m];
      int []g=new int[m];
      int []t=new int[m];

      if(m==1){
        return 0;
      }
      f[0]=-prices[0];
      for(int i=1;i<m;i++){
   f[i]=Math.max(f[i-1],g[i-1]-prices[i]);
   t[i]=f[i-1]+prices[i];
   g[i]=Math.max(g[i-1],t[i-1]);
      }
      
    return Math.max(f[m-1],Math.max(t[m-1],g[m-1])); 
    }
}

四、手续费的买卖股票

手续费股票

蓝桥杯动态规划第三弹-路径问题进阶2.0,蓝桥杯,动态规划,职场和发展

1.状态表示

f[i]:第i天的时候,买入后但没有进行别的操作的状态(未卖出,手里有股票)状态的最大利润(这里你思考一下,这个卖出状态和处于冷冻期状态,有没有必要去把这两个状态更细化的区分。)

g[i]:第i天的时候,股票处于股票卖出但是没有进行别的操作状态,没买但是可以买的状态(手里面没股票,要去买)的最大利润

注意:是股票卖出之后支付手续费(原因其实可以看他给的例子,它是卖出减去进货,然后再去减手续费

2.状态方程

f[i]=Math.max(f[i-1],g[i-1]-prices[i])

g[i]=Math.max(f[i-1]+prices[i]-fee,g[i-1])

3.初始化

f[0]为买入之后,所以直接赋值为-prices[0]

4.填表顺序

从左到右,两个表一个填写

5.返回值

return max(f[],g[]);文章来源地址https://www.toymoban.com/news/detail-736361.html

class Solution {
    public int maxProfit(int[] prices, int fee) {
    int m=prices.length;
    int f[]=new int[m];
    int g[]=new int[m];

    f[0]=-prices[0];
    for(int i=1;i<m;i++){
    f[i]=Math.max(f[i-1],g[i-1]-prices[i]);
     g[i]=Math.max(f[i-1]+prices[i]-fee,g[i-1]);
    }
     return Math.max(f[m-1],g[m-1]); 
    }
}

到了这里,关于蓝桥杯动态规划第三弹-路径问题进阶2.0的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划|【路径问题】|931.下降路径最小和

    目录 题目 题目解析 思路 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 代码 931. 下降路径最小和 给你一个  n x n  的  方形  整数数组  matrix  ,请你找出并返回通过  matrix  的 下降路径   的   最小和  。 下降路径  可以从第一行中的任何元素开始,并从每一

    2024年04月13日
    浏览(43)
  • 动态规划之路径问题

    1.题目链接:不同路径 2.题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 3.问题分析: 对于 动态

    2024年02月11日
    浏览(48)
  • C++--动态规划路径问题

    1.不同路径 力扣 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径

    2024年02月15日
    浏览(42)
  • 动态规划——路径问题

    目录 什么是路径问题? 练习 练习1:不同路径  练习2:不同路径II 练习3:珠宝的最高价值 练习4:下降路径最小和 练习5:地下城游戏 动态规划中的路径问题: 指在一个给定的网格中,从起点到终点有多条可能的路径,每条路径都有一个特定的权重或成本,动态规划路径问

    2024年04月27日
    浏览(46)
  • 动态规划-路径问题

    题目描述: 状态表示: 设dp[i][j]表示到达(i,j)位置时的路径数目。 状态转移方程: dp[i][j]=dp[i-1][j]+dp[i][j-1]。这里分析起来很简单,因为这算是很经典的问题了。机器人只能向下或者向右走,所以到达(i,j)就有两种方式,分别是从(i-1,j)向下以及(i,j-1)向右,那么到达(i,j)位置的

    2024年04月17日
    浏览(35)
  • 【动态规划】路径问题

    冻龟算法系列之路径问题 本文为动态规划的第二章:路径问题,重点讲解关于路径有关的问题,上一篇文章是一维的,那么路径问题就是二维的,通过题目可见需要创建二维的dp表,而以下将通过“解题”的方式去学习动归知识! 创建什么样的dp表,其实看题目就可以看出来

    2024年02月09日
    浏览(39)
  • 【动态规划专栏】专题二:路径问题--------1.不同路径

    本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:动态规划专栏 🚚代码仓库:小小unicorn的代码仓库🚚

    2024年02月20日
    浏览(45)
  • 【动态规划】路径问题_不同路径_C++

    题目链接:leetcode不同路径 目录 题目解析: 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目让我们求总共有多少条不同的路径可到达右下角; 由题可得: 机器人位于一个  m x n   网格; 机器人每次只能向下或者向右移动一步; 我们拿示例

    2024年02月05日
    浏览(39)
  • 算法沉淀 —— 动态规划篇(路径问题)

    几乎所有的动态规划问题大致可分为以下5个步骤,后续所有问题分析都将基于此 1.、状态表示:通常状态表示分为基本分为以下两种,其中更是以第一种为甚。 以i为结尾 ,dp[i] 表示什么,通常为代求问题(具体依题目而定) 以i为开始 ,dp[i]表示什么,通常为代求问题(具

    2024年04月17日
    浏览(43)
  • 动态规划之不同路径解决问题

    题目链接选自力扣 : 不同路径 题目不难读懂, 就是遵循一个规则, 机器人从起点开始, 只允许向右或者向下行走, 不允许返回而最终到达终点时一共有多少种不同的路径. 比如在一个 2 * 3 的矩阵里, 从做烧焦起点(0,0) 到达终点右下角(1,2) 一共有多少种方法. 通过题目要求, 发现一

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包