从一开始的暴力递归到傻瓜式的缓存动态规划到最终的动态规划

package day_16;/*** 给定一个整型数组arr,代表数值不同的纸牌排成一条线* 玩家A和玩家B依次拿走每张纸牌* 规定玩家A先拿,玩家B后拿* 但是每个玩家每次只能拿走最左或最右的纸牌* 玩家A和玩家B都绝顶聪明* 请返回最后获胜者的分数。* @Author huawei* @Date 2021/5/12 16:44* @Version 1.0*/
public class Code02_CardsInLine{public static int win1(int [] array){if(array == null || array.length == 0){return -1;}return Math.max(b(array,0,array.length-1),a(array,0,array.length - 1));}/*** 在L...R的范围之内先手* @param array* @return*/public static int b(int [] array,int L,int R){if( L == R ){// 说明只剩一张牌return array[L];}// 先手拿 分为两种情况,第一种,先手拿左 + 后手拿 ,第二种,先手拿右 + 后手拿// 这个后手就看成是一个黑盒,因为是绝顶聪明,所以一定会取这两次最大的值return Math.max(array[L] + a(array,L + 1,R),array[R] + a(array,L,R - 1));}public static int a(int [] array,int L,int R){if(L == R){// 如果只剩一张牌,因为是后手,所以这张牌一定被对方的先手拿走,因为是绝顶聪明return 0;}// 后手拿分为两种情况,对方的先手拿走了最左边的那张和对方的先手拿走了最右边的那张,因为是绝顶聪明// 对方的先手只会将这两者的最大值拿走,所以我们应该取最小值return Math.min(b(array,L + 1,R),b(array,L,R - 1));}// 傻缓存法public static int win2(int [] array){int N = array.length;// 因为先手和后手相互依赖 所以要有两张缓存表int [][] dp1 = new int[N][N];int [][] dp2 = new int[N][N];for(int i = 0 ; i < N ; i++){for(int j = 0 ; j < N ; j++){dp1[i][j] = -1;dp2[i][j] = -1;}}return Math.max(b1(array,0,N - 1,dp1,dp2),a1(array,0,N - 1,dp1,dp2));}public static int b1(int[] array,int L ,int R ,int[][] dp1 , int [][] dp2){if(dp1[L][R] != -1){return dp1[L][R];}int ans = 0;if(L == R){ans = array[L];}else{ans = Math.max(array[L] + a1(array,L + 1,R,dp1,dp2),array[R] + a1(array,L,R - 1,dp1,dp2));}dp1[L][R] = ans;return ans;}public static int a1(int [] array,int L,int R,int [][] dp1,int [][] dp2){if(dp2[L][R] != -1){return dp1[L][R];}int ans = 0;if(L == R){return 0;}else{ans = Math.min(b1(array,L + 1, R,dp1,dp2),b1(array,L,R - 1,dp1,dp2));}dp2[L][R] = ans;return ans;}/*** 利用前面的内容来完成动态规划* 通过暴力递归就可以完成对动态规划的求解* @param array* @return*/public static int win3(int [] array){if(array == null || array.length == 0){return -1;}int N = array.length;int [][] dp1 = new int[N][N];int [][] dp2 = new int[N][N];// 根据对角线来求for(int i = 0 ; i < N ; i++){dp1[i][i] = i;}// 然后根据对角线来求解// 根据列来遍历整个矩阵for(int i = 1 ; i < N ; i++){// 行int L = 0;// 列int R = i;while(R < N){dp1[L][R] = Math.max(array[L] + dp2[L + 1][R],array[R] + dp2[L][R - 1]);dp2[L][R] = Math.min(dp1[L + 1][R],dp1[L][R - 1]);L++;R++;}}return Math.max(dp1[0][N - 1],dp2[0][N - 1]);}public static void main(String[] args) {System.out.println(win1(new int[]{1, 100, 1,2}));System.out.println(win2(new int[]{1, 100, 1,2}));System.out.println(win3(new int[]{1, 100, 1,2}));}}

数据结构和算法之暴力递归到动态规划01-绝顶聪明纸牌问题相关推荐

  1. 数据结构与算法之暴力递归改动态规划

    数据结构与算法之暴力递归改动态规划 目录 二维数组最小路径和 暴力递归改动态规划解析 任意选择数组arr中的数字,看能不能累加得到aim 1. 二维数组最小路径和 (一) 题目描述 (二) 思路 递归 ...

  2. 带你击杀动态规划梦魇-从暴力递归到动态规划

    本文章欢迎转载,但是转载请标明出处,程序锋子https://blog.csdn.net/l13591302862/article/details/111410091 想要分享下自己之前学习动态规划的过 ...

  3. 史上最容易理解的暴力递归和动态规划~~

    史上最容易理解的暴力递归和动态规划~~ 介绍递归和动态规划 暴力递归: 1, 把问题转化为规模缩小了的同类问题的子问题 2, 有明确的不需要继续进行递归的条件(base case) 3, 有当得到了子 ...

  4. 暴力递归转动态规划----以货币数问题展开

    接着上道题,这道题也是用来感受暴力递归优化成动态规划的套路.先想暴力尝试的方法,然后优化成动态规划.首先是原问题的暴力尝试方法.只有想出尝试方法是最难.最重要的. 我们首先来看一下题目: 给你一个数组 ...

  5. 算法与数据结构——算法基础——暴力递归(回溯)(java)(左程云b站课程总结)

    暴力递归 暴力递归就是尝试 类似于回溯:可以理解为回溯就是在暴力递归的基础上在每个操作步骤加上标记和取消标记的处理 把问题转化为规模缩小了的同类问题的子问题 有明确的不需要继续进行递归的条件(base ...

  6. 背包问题算法实现(全组合、暴力递归、动态规划及空间压缩、对数器)

    背包问题的实现 * 1.全组合解法(对数器) * 2.暴力递归解法 * 3.动态规划解法 * 4.动态规划(省空间)解法 对数器的思路是:求解n个物品的全组合中不超过背包容量的组合对应的最大价值(时间 ...

  7. 数据结构与算法--再谈递归与循环(斐波那契数列)

    再谈递归与循环 在某些算法中,可能需要重复计算相同的问题,通常我们可以选择用递归或者循环两种方法.递归是一个函数内部的调用这个函数自身.循环则是通过设置计算的初始值以及终止条件,在一个范围内重复运算. ...

  8. python递归编程题_Python数据结构与算法41:递归编程练习题4:铺瓷砖

    注:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性. 本文阅读时间约为8分钟. 递归编程练习题4:铺瓷砖 给定一个长度为N的区域,及4种不同长度的瓷砖:灰瓷砖(长为1格).红瓷 ...

  9. 【算法】【递归与动态规划模块】两个字符串的公共最长子序列

    目录 前言 问题介绍 解决方案 代码编写 java语言版本 c语言版本 c++语言版本 思考感悟 写在最后 前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批 ...

最新文章

  1. 所有被td:last-child a影响到了的Spartacus表格
  2. (转)FPGA的速度等级(speed grade)
  3. 设计模式--策略模式--Java实现
  4. CodeForces888E Maximum Subsequence(折半枚举+two-pointers)
  5. 查看被Linux干掉的进程,Linux 查看进程被杀死的详情
  6. acrobat xi pro 简体中文语言支持包_在朋友圈收表情包收到手软?预感下一个好玩的功能会是它...
  7. 桌面图标分类软件Fences的缺点
  8. FT232RL国产替代GP232RL USB2.0串口芯片
  9. 【计算机图形学】Liang-Barsky裁剪算法(C++实现)
  10. python中无法安装xpath库,Python爬虫 | xpath的安装
  11. Laravel执行seeder命令出现class *** does not exist
  12. 设置安卓app页面强制横屏或者竖屏,不随手机姿势变化
  13. 【Excel学习笔记13】对一个单元格内容进行条件分列,分列成多列
  14. 【STM32】NVIC 中断优先级管理,抢占优先级,响应优先级,中断寄存器
  15. 腾讯云服务器无法通过密钥登录
  16. 没有windows安装光盘怎么修复计算机,电脑没有u盘光盘重装windows7系统的方法步骤教程 - 系统家园...
  17. 《高效能人士的七个习惯》丨一本被书名耽误的必读好书
  18. 前端——CSS学习总结
  19. Android 使用VasDolly 实现多渠道打包
  20. 用HDMI外接显示这颜色感觉就是不对哦?!

热门文章

  1. (转载)纳豆的家庭制作、保存和食用
  2. 安装mathtype时找不到文件mathpage.wil
  3. 【数据挖掘】任务4:20Newsgroups聚类
  4. 支付验签失败_微信支付 支付验证签名失败 prepay_id配置问题
  5. vba 云服务器,EXCEL服务器中VBA接口函数介绍
  6. 三极管3种基础接法比较
  7. Axure交互模拟线框图等等
  8. 币圈假币泛滥:造假团伙骗走上亿,买别墅开豪车
  9. 财务管理专业写毕业论文有没有什么好的选题?
  10. 《成为沃伦·巴菲特》笔记与感想