动态规划学习——赢得最大数

2024-01-24 00:20

本文主要是介绍动态规划学习——赢得最大数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

给一个数组,表示纸牌,每张纸牌有一定的大小
两个人依次选择左边或者右边的纸牌,获得相应的点数
最后点数较大的为胜者
注:两个人都是聪明人,意味着拿牌会选择让自己获得更多的,让对方获得更少的选择

代码如下:

//给一个数组,表示纸牌,每张纸牌有一定的大小
//两个人依次选择左边或者右边的纸牌,获得相应的点数
//最后点数较大的为胜者
//注:两个人都是聪明人,意味着拿牌会选择让自己获得更多的,让对方获得更少的选择
#include<iostream>
#include<algorithm>
using namespace std;
int arr[10000];
int N;
int first1(int L,int R);
int second1(int L,int R);
int first2(int L,int R);
int second2(int L,int R);
int ways2_first[10000][10000];
int ways2_second[10000][10000];
int ways3_first[10000][10000];
int ways3_second[10000][10000];//法一:直接递归
int ways1()
{int first=first1(0,N-1);int second=second1(0,N-1);return max(first,second);
}//先手函数
//先手有两个选择,一是拿左边的纸牌,则其点数为arr[L]+second1(L+1,R);二是拿右边的牌,则其点数为arr[R]+second1(L,R-1)
//而最终的选择是让自己的点数尽可能大,所以用max求最大值
int first1(int L,int R)
{if(L==R) return arr[L];else{int t1=arr[L]+second1(L+1,R);int t2=arr[R]+second1(L,R-1);return max(t1,t2);}
}
//后手函数
//后手只能等待对方拿纸牌,而对方可以拿左边也可以拿右边的,最终对方要让后手拿到的点数尽可能小,所以用min函数求最小值
int second1(int L,int R)
{if(L==R) return 0;else{int t1=first1(L+1,R);int t2=first1(L,R-1);return min(t1,t2);} 
}//法二:带有缓存的递归
int ways2()
{//初始化int i,j;for(i=0;i<=N;i++)for(j=0;j<=N;j++){ //注意这里不要掉了括号,因为这个调试了半天ways2_first[i][j]=-1;ways2_second[i][j]=-1;}int first=first2(0,N-1);int second=second2(0,N-1);return max(first,second);
}int first2(int L,int R)
{int ans=0;if(ways2_first[L][R]!=-1) return ways2_first[L][R];else{if(L==R) ans=arr[L];else{int t1=arr[L]+second2(L+1,R);int t2=arr[R]+second2(L,R-1);ans=max(t1,t2);}ways2_first[L][R]=ans;}return ans;
}int second2(int L,int R)
{int ans=0;if(ways2_second[L][R]!=-1) return ways2_second[L][R];else{if(L==R) ans=0;else{int t1=first2(L+1,R);int t2=first2(L,R-1);ans=min(t1,t2);}ways2_second[L][R]=ans;}return ans;
}//法三:动态规划
int ways3()
{int i;for(i=0;i<N;i++){ways3_first[i][i]=arr[i];ways3_second[i][i]=0;}for(int startcol=1;startcol<N;startcol++){ int L=0;int R=startcol;while(R<N){ways3_first[L][R]=max(arr[R]+ways3_second[L][R-1],arr[L]+ways3_second[L+1][R]);ways3_second[L][R]=min(ways3_first[L][R-1],ways3_first[L+1][R]);L++;R++;}}return max(ways3_first[0][N-1],ways3_second[0][N-1]);
}int main()
{int choice=0;do{cout<<"请输入数组长度:"<<endl;cin>>N;int i=0;cout<<"请输入数组中每个数的值"<<endl;for(i=0;i<N;i++) cin>>arr[i];int result1=ways1();cout<<"法一 直接递归 的结果为 "<<result1<<endl;int result2=ways2();cout<<"法二 缓存递归 的结果为 "<<result2<<endl;int result3=ways3();cout<<"法三 动态规划 的结果为 "<<result3<<endl;cout<<"继续请输入1"<<endl;cin>>choice;}while(choice==1);return 0;
}

参考资料:

bilibili 马士兵教育——左程云

【应B友要求火速上线!算法大神(左程云)教你从暴力递归到动态规划,吊打所有暴力递归、动态规划问题】https://www.bilibili.com/video/BV1ET4y1U7T6?p=13&vd_source=4e9b7dd8105df854ae96830c97920252

这篇关于动态规划学习——赢得最大数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/637994

相关文章

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL