原题链接:https://leetcode-cn.com/problems/minimum-swaps-to-make-sequences-increasing/

动态规划

dp[0]表示若当前位置不做交换时的次数
dp[1]表示若当前位置做交换时的次数

同时初始化dp[0]=0,dp[1]=1,表示第一步要么换要么不换。然后分析一下题目的状态,共有四种状态:

1、A[i-1]<A[i] && B[i-1]< B[i]
2、A[i-1]>=A[i] || B[i-1]>=B[i]
3、A[i-1]>=B[i] || B[i-1]>=A[i]
4、A[i-1]<B[i] && B[i-1]<A[i]

然后对每个状态考虑如何状态转移,backup保存dp上个位置的状态。

1、 正确的情况,不一定做改变,如果前一个交换了,这个可以交换或不交换;如果前一个不交换,这个也可以交换或不交换。
dp[0]=backup[0]||backup[1];
dp[1]=backup[0]+1||backup[1]+1;
2、 必须做改变,如果前一个交换了,则这个不用交换;如果前一个没交换,则这个交换。
dp[0]=backup[1];
dp[1]=backup[0]+1;
3、 不一定做改变,但是如果前一个交换了,这个也必须交换;如果前一个没有交换,则这个也不用交换。
dp[0]=backup[0];
dp[1]=backup[1]+1;
4、不一定做改变,如果前一个交换了,这个可以交换或不交换;如果前一个不交换,这个也可以交换或不交换,同1的情形是一样的。
dp[0]=backup[0]||backup[1];
dp[1]=backup[0]+1||backup[1]+1;

值得注意的是,2和3是互斥的,同时只有一个可能发生;而1和4不是互斥的,可能同时发生,所以将两种情况整合在一起,用贪心算法,既然可做可不做,那就不做,取前一步的最小值min(backup[0],backup[1]),于是dp[0]=min,dp[1]=min+1。

int minSwap(vector<int>& A, vector<int>& B) {int len=A.size();vector<int> dp{0,1};vector<int> backup;for(int i=1;i<len;i++){backup=dp;if(A[i-1]>=A[i]||B[i-1]>=B[i]){dp[0]=backup[1];dp[1]=backup[0]+1;}else if(A[i-1]>=B[i]||B[i-1]>=A[i]){dp[0]=backup[0];dp[1]=backup[1]+1;}else{dp[0]=min(backup[0],backup[1]);dp[1]=min(backup[0],backup[1])+1;}}return min(dp[0],dp[1]);
}

leetcode算法题--使序列递增的最小交换次数★相关推荐

  1. Java实现 LeetCode 801 使序列递增的最小交换次数 (DP)

    801. 使序列递增的最小交换次数 我们有两个长度相等且不为空的整型数组 A 和 B . 我们可以交换 A[i] 和 B[i] 的元素.注意这两个元素在各自的序列中应该处于相同的位置. 在交换过一些元 ...

  2. LeetCode 801. 使序列递增的最小交换次数(动态规划)

    1. 题目 我们有两个长度相等且不为空的整型数组 A 和 B . 我们可以交换 A[i] 和 B[i] 的元素.注意这两个元素在各自的序列中应该处于相同的位置. 在交换过一些元素之后,数组 A 和 B ...

  3. leetcode - 801. 使序列递增的最小交换次数

    解题思路:使用两个状态量来存储信息: swap[i]表示交换A和B中第i个数字,A和B中前i个数字达到严格递增所需要的最小交换次数. keep[i]表示不交换A和B中第i个数字,A和B中前i个数字达到 ...

  4. LeetCode 1864. 构成交替字符串需要的最小交换次数

    文章目录 1. 题目 2. 解题 1. 题目 给你一个二进制字符串 s ,现需要将其转化为一个 交替字符串 . 请你计算并返回转化所需的 最小 字符交换次数,如果无法完成转化,返回 -1 . 交替字符 ...

  5. leetcode算法题--两个字符串的最小ASCII删除和★

    原题链接:https://leetcode-cn.com/problems/minimum-ascii-delete-sum-for-two-strings/ 相关题目:最长公共子序列 1.递归(超时 ...

  6. leetcode算法题--数字序列中某一位的数字

    原题链接:https://leetcode-cn.com/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof/ int findNthDigi ...

  7. leetcode算法题-- 最长递增子序列的个数★

    原题链接:https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence/ 相关题目:最长上升子序列 lengths ...

  8. leetcode算法题--摆动序列★

    原题链接:https://leetcode-cn.com/problems/wiggle-subsequence/ 相关问题:最长湍流子数组 动态规划 使用两个数组up和down up[i] 代表i位 ...

  9. leetcode算法题--将数字变成 0 的操作次数

    原题链接:https://leetcode-cn.com/problems/number-of-steps-to-reduce-a-number-to-zero/ class Solution {pu ...

最新文章

  1. 如何在小型pcb的移动设备上获得更好的无线性能
  2. 计算机硬件技术 实验的软件,计算机硬件技术基础软件实验讲义.doc
  3. python【力扣LeetCode算法题库】面试题57 - II-和为s的连续正数序列(滑动窗口)
  4. Silverlight+WCF 新手实例 象棋 主界面-事件区-求和认输(三十二)
  5. MySQL 主从架构配置详解
  6. 机器学习算法-PCA降维技术
  7. Linux 批量创建用户及设置随机密码
  8. 位移的单位符号_初中物理符号级单位符号公式大全
  9. 分享一个下载系统镜像的网站
  10. 东北师范大学计算机信息技术学院,东北师范大学计算机科学与信息技术学院2015年硕士研究生招生专业目录...
  11. 太阳表面的重力加速度
  12. 统计学基于matlab,MATPLOT:一款基于MATLAB的地球化学数据分析成图软件
  13. 在线压缩图片大小网站分享
  14. 微信小程序--微信支付流程
  15. 《Effective Modern C++》笔记
  16. WinRAR捆绑木马
  17. Space chick获得Blockchain、SNZ、1con等多家资本战略投资 助推项目快速发展
  18. 算法基础(2) | 高精度、前缀和、差分
  19. codeforces 558c558d558e
  20. 避坑,在Jetson nano安装编辑openpose

热门文章

  1. python常见错误-python中的错误有什么
  2. python syntaxerror怎么解决-python中出现invalid syntax报错的几种原因
  3. python实现http下载文件-Python实现http文件下载
  4. python怎么把数据写入txt-python(如何将数据写入本地txt文本文件)
  5. python自学路线-Python最佳学习路线
  6. mybatis不使用动态代理查询时设计与实现
  7. LeetCode Gas Station(双指针 )
  8. 计算几何中的线段相交判断问题
  9. 使用iframe call server及iframe target使用例
  10. 【7.2】__getattr__、__getattribute__魔法函数