当前位置: 首页 > news >正文

实验二:动态规划

1.双11的红包雨

问题描述

双11到了,据说这2天会下红包雨,每个红包有不同的价值,小k好开心,但有个规则,就只能接掉落在他身旁的10米范围内的红包(0-10这11个位置)。小k想尽可能的多抢红包,这样就可以去买一个华为手机,小k每秒种只能在移动不超过一米的范围内接住红包。小k一开始站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的红包。问小k最多可能接到多少价值的红包?

输入

第一行输入整数n,表示共有多少个红包,n<1000;

后面n行表示n个红包,每行有三个整数,分别表示红包掉落的位置、时间和价值。

输出

小k接到的红包价值之和。

输入样例

8
3 18 5
7 13 7
1 8 10
2 7 13
10 20 1
3 17 8
10 2 123
3 13 45

输出样例

81

每个时刻的状态只有三种

  1. 继续站在原地

  2. 向左移动

  3. 向右移动

    此外还要注意一点,在0处不能向左移动,在11处不能向右移动。

    状态转移方程
    dp[i][j]=maxn(dp[i+1][j−1],dp[i+1][j],dp[i+1][j+1])+dp[i][j]dp[i][j]=maxn(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1])+dp[i][j] dp[i][j]=maxn(dp[i+1][j1]dp[i+1][j]dp[i+1][j+1])+dp[i][j]

#include<bits/stdc++.h>
using namespace std;int dp[1010][12];  // dp[i][j]表示i时刻j位置开始出发,到最终时间点所获得的最大红包数
//两个数中的最大值
int max_2(int a, int b)
{return (a>b) ? a :b;
}
//三个数中的最大值
int maxn(int a, int b, int c)
{int max = (a>b) ? a : b;return (max>c) ? max : c;
}
// 计算最优值
// 状态转移方程为:dp[i][j]=maxn(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1])
void maxValue(int max_time)
{//对于每个时间所有位置从结束计算到开头//当记录了上一时刻的最大值,可以以此为参照,计算出所有位置该时刻的最大值//两重循环之后可以获取所有位置所有时刻的最大值for(int i=max_time-1; i>=0; i--){for(int j=0; j<12; j++){if(j == 0)  // 在第0位置,下一秒只能原地或向右移动 dp[i][j] = max_2(dp[i+1][j],dp[i+1][j+1]) + dp[i][j];else if(j == 11)   // 在第11位置,下一秒只能原地或向左移动 dp[i][j] = max_2(dp[i+1][j],dp[i+1][j-1]) + dp[i][j];else// 其他情况,每个时刻能够向左右或者不动dp[i][j] = maxn(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1])+ dp[i][j];}}
}
int main()
{int n;cin >> n;int location, time, value;int max_time = -1;memset(dp, 0, sizeof(dp));// 保存输入的数据到数组中 while(n--){cin >> location >> time >> value;dp[time][location] = value;if(time > max_time) max_time = time;}// 求出最大的红包maxValue(max_time);// dp[1][4]为初始时刻、初始位置对应的价值,已经从最后时刻推回来了,所以一定是最优解。cout << dp[1][4] << endl;return 0;
}

2.最大连续字段和

问题描述:略

只有两种情况:

  1. 某位置最大连续子段为它本身
  2. 最大连续子段长度至少为 2(至少包含它之前的一个节点)

取两者的最大值,递推方程:
dp[i]=max(dp[i−1]+arr[i],arr[j])dp[i]=max(dp[i-1]+arr[i],arr[j]) dp[i]=max(dp[i1]+arr[i],arr[j])

#include<bits/stdc++.h>
using namespace std;
int main()
{int num;cin>>num;int arr[num],dp[num]; // 读数据for(int i=0;i<num;i++){ cin>>arr[i];dp[i]=0;}// 初始化dp[0]=max(arr[0],0);for(int i=1;i<num;i++){// 状态转移方程dp[i]=max(arr[i],dp[i-1]+arr[i]); }sort(dp,dp+num);//排序cout<<dp[num-1];//输出最大值 return 0;
}

3.减肥的小k 2

题目描述

小K是个苦命的孩子,他的师傅为了多赚钱,以减肥为理由,让他去采药,并说不完成不能吃饭。野地里有许多不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。要求在规定的时间t里,采到的草药的总价值最大。

输入

第一行有2个整数T(1≤T≤1000)和M(1≤M≤100),一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。

输出

1个整数,表示在规定的时间内可以采到的草药的最大总价值。

输入样例

70 3
71 100
69 1
1 2

输出样例

3

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1005; // 最大草药数量
const int MAXT = 1005; // 最大采药时间
int t[MAXN], v[MAXN];  // t[i]是第i个草药的采摘时间,v[i]是第i个草药的价值
int dp[MAXT];          // dp[j]表示用j的时间采摘草药的最大价值
int main()
{int T, M;cin >> T >> M; // T是总时间,M是草药数量for (int i = 1; i <= M; i++){cin >> t[i] >> v[i]; // 输入每个草药的采摘时间和价值}memset(dp, 0, sizeof(dp)); // 初始化dp数组为0for (int i = 1; i <= M; i++){for (int j = T; j >= t[i]; j--){// 从后往前遍历,防止重复计算dp[j] = max(dp[j], dp[j-t[i]]+v[i]); // 状态转移方程}}cout << dp[T] << endl; // 输出用T的时间采摘草药的最大价值return 0;
}

4.最长非连续公共子序列

题目描述

dp [ i ] [ j ] 表示第一个串前 i 个与第二个串前 j 个组成的 lcs 子问题

状态转移方程:

如果当前指针两个字符相同:
dp[i][j]=dp[i−1][j−1]+1dp[i][j] = dp[i-1][j-1] + 1 dp[i][j]=dp[i1][j1]+1
如果当前指针两个字符不同:

需要从前面的两个状态恢复,两个状态分别为 dp [ i-1 ] [ j ] 和 dp [ i ] [ j-1 ] ,将它们的最大值作为该位置的状态
dp[i][j]=max(dp[i−1][j],dp[i][j−1])dp[i][j] = max(dp[i-1][j], dp[i][j-1]) dp[i][j]=max(dp[i1][j],dp[i][j1])

#include<bits/stdc++.h>
using namespace std;
int lcs(string s1, string s2) 
{// 初始化int m = s1.size();int n = s2.size();int dp[m+1][n+1];memset(dp, 0, sizeof(dp));// 对于a,b两个字符串,分别设定两个指针a,b// 指针分别从头开始向后移动,取两个字符串前i,j个// 这样就存在两种情况// 1.两个指针处的字符相同说明存在子串,dp[i][j] = dp[i-1][j-1] + 1 从ab指针同时退后两个的情况+1// 2.如果两个指针指向的字符不相同,说明不能从 i-1,j-1 跳转到 i,j,但是为了保存之前的结果,需要存储当前// 的最优解,当前是将两个指针同时前进1个单位,最优解一定在左指针前进一个或右指针前进一个里面选// 这就推出了最终的状态转移方程for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (s1[i-1] == s2[j-1]) {dp[i][j] = dp[i-1][j-1] + 1;}else{dp[i][j] = max(dp[i-1][j], dp[i][j-1]);}}}return dp[m][n];
}
int main() 
{string s1 = "ABCD";string s2 = "ABDE";cout << lcs(s1, s2) << endl;  // 输出 2,即 "AB" 是最长非连续公共子序列return 0;
}

5.切钢条

题目描述

一家公司购买长钢条,将其切割成短钢条出售,切割本身没有成本,长度为i的短钢条的价格为Pi。那给
定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大。

在这里插入图片描述

输入要求

输入钢条的长度n。

输出要求

输出获得的最大收益。

dp [ i ] 表示长度为 i 的情况下的最大利润

共有 10 种切法,所以要设置两重循环,目的是获得每个长度下的最优解,有了小长度才能以此为基础获取大长度的最优解

有两种状态,切或不切,切掉之后要考虑价值是否增加,所以产生了状态转移方程:
dp[i]=max(pi[j]+dp[i−j],dp[i])dp[i] = max(pi[j] + dp[i - j], dp[i]) dp[i]=max(pi[j]+dp[ij],dp[i])

#include<bits/stdc++.h>
using namespace std;
int pi[11] = { 0,1,5,8,9,10,17,17,20,24,30 }; //记录已知长度钢条价值
int dp[1000] = { 0 };//记录动态规划结果
int findMaxVal(int n)
{if (n == 0) // 若n为0直接返回return 0;for (int i = 1;i <= n;i++) {for (int j = 1;j <= i && j <= 10;j++) { // 第一刀最多切10种dp[i] = max(pi[j] + dp[i - j], dp[i]);//遍历所有切法}}return dp[n];
}
int main()
{int n;cin >> n;memset(dp,0,sizeof(dp));// 判断一下是否超过10,记录除数和余数int chushu = 0;int yushu = 0;int res_10 = 0;int res = 0;if(n>10){chushu = n / 10;yushu = n % 10;res_10 = findMaxVal(10);res_10 *= chushu;res = res_10 + findMaxVal(yushu);}else{res = findMaxVal(n); }cout << res << endl;return 0;
}

6.合格的盗贼

题目描述

一条街上有N个商铺;商铺i有价值V[i]的物品,你有足够的时间在晚上光顾所有的商店,人们称呼你为盗贼;每个商店都有一个报警器,会在晚上报警,但是只有相邻的2个商店同时报警时,警察才会出动;你需要证明你是个合格的盗贼。

输入要求

第一行一个整数N<=100,商店数。
第二行N个整数,每个商店的价值

输出要求

输出偷盗的最大价值。

假设在考虑第i个,只有两种个情况,只有这两种情况收益最大,按照这种思想往下推很简单就能求出最大利润

  1. 第一种,i,i - 2
  2. 第二种,i - 1
#include<bits/stdc++.h>
using namespace std;
int dp[101] = { 0 };
int findMaxValue(int n)
{if (n == 1)return dp[0];else if (n == 2)return max(dp[0], dp[1]);dp[1] = max(dp[0], dp[1]);for (int i = 3;i <= n;i++){// 只有两种选择,假设有 a b c 三个连续的位置// 只有两种选择不会触发警报// 1. a c// 2. b// 依据这个限制条件可以给出状态转移方程dp[i - 1] = max(dp[i - 2], dp[i - 3] + dp[i - 1]);}return dp[n - 1];
}
int main()
{int n;cin >> n;for (int i = 0;i < n;i++) {cin >> dp[i];}int res = findMaxValue(n);cout << res << endl;return 0;
}

相关文章:

实验二:动态规划

1.双11的红包雨 问题描述 双11到了&#xff0c;据说这2天会下红包雨&#xff0c;每个红包有不同的价值&#xff0c;小k好开心&#xff0c;但有个规则&#xff0c;就只能接掉落在他身旁的10米范围内的红包&#xff08;0-10这11个位置&#xff09;。小k想尽可能的多抢红包&…...

华为机试 HJ27 查找兄弟单词

题目链接&#xff1a;https://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68?tpId37&tqId21250&rp1&ru/exam/oj/ta&qru/exam/oj/ta&sourceUrl%2Fexam%2Foj%2Fta%3Fdifficulty%3D3%26page%3D1%26pageSize%3D50%26search%3D%26tpId%3D37%26t…...

佩戴舒适的蓝牙耳机有哪些?佩戴舒适的蓝牙耳机推荐

音乐对许多人而言&#xff0c;都是一种抚慰生命的力量&#xff0c;特别是在上下班的时候&#xff0c;在熙熙攘攘的人流中&#xff0c;戴着耳机听一首动听的曲子&#xff0c;无疑会让人心情变得更加舒畅&#xff0c;要想获得出色的音乐体验&#xff0c;没有一副出色的耳机可不行…...

ESXI主机安装Zabbix 6.2

1&#xff1a;首先下载Zabbix Appliance 2&#xff1a;还需要下载VMware converter &#xff0c;这个需要VMware的账号&#xff0c;或者从其他地方下载也可以。 3:vmdk格式的 image 可直接在 VMware Player、 Server 和 Workstation 产品中使用。要在 ESX,、ESXi 和 vSphere 中…...

【Linux 网络编程1】使用UDP/TCP编写套接字,多进程/多线程版本的TCP编写的套接字,将套接字封装

目录 1.学习网络编程前的一些基础知识 2.UDP(user datagram protocol)协议的特点 3.使用有UPD编写套接字 4.使用TCP编写套接字 4.2.TCP客服端 4.3.TCP服务器端 4.4.单进程版本&#xff08;没有人会使用&#xff09; 4.5.多进程版本 4.6.多线程版本 5.把套接字封装 1…...

滑动窗口求最大和最小

滑动窗口 要区分最小和最大滑窗&#xff0c;内层while循环的条件和更新结果的地方 核心&#xff1a; 关键的区别在于&#xff0c;最大滑窗是在迭代右移右边界的过程中更新结果&#xff0c;而最小滑窗是在迭代右移左边界的过程中更新结果。 最小滑窗 给定数组 nums&#xff0…...

跟ChatGPT学量化,菜鸟炒股也不怕

你是一个python资深量化开发工程师&#xff0c;请介绍量化交易的基本框架 量化交易的基本框架包括以下几个步骤&#xff1a; 数据获取&#xff1a;获取市场数据和公司财务数据等&#xff0c;可以使用API接口、爬虫等方式获取。数据清洗和预处理&#xff1a;对获取到的数据进行清…...

扬帆优配|2600亿新能源巨头狂飙!外资唱多中国:再涨15%

全国停摆的危机&#xff0c;正在迫临法国。 大停工正在将法国推向风险境地。法国政府估计&#xff0c;当地时间3月7日&#xff0c;将迸发全国大型停工游行。法国总工会宣告&#xff0c;到时将让全法国停摆。法国担任交通业务的部长级代表克莱蒙博讷正告称&#xff0c;7日将成为…...

ChatGPT技术与商业模式及产业发展布局方案

文章目录模块一&#xff1a;概念模块二&#xff1a;架构模块三&#xff1a;技术模块四&#xff1a;算力模块五&#xff1a;体验模块六&#xff1a;应用模块七&#xff1a;商业模块八&#xff1a;产业模块九&#xff1a;建议结语主要内容&#xff1a; 采用模块化教学方法&#x…...

CIMCAI port ai shipping ai artificial intelligence smart port

上海人工智能独角兽中集集团高科技中集飞瞳&#xff0c;是全球应用落地最广&#xff0c;规模最大&#xff0c;最先进的的港航人工智能高科技企业&#xff0c;工业级成熟港航人工智能产品全球规模化落地应用&#xff0c;全球前三大船公司及港口码头应用落地。上海人工智能独角兽…...

《数据解构》HashMap源码解读

&#x1f451;作者主页&#xff1a;Java冰激凌 &#x1f4d6;专栏链接&#xff1a;数据结构 目录 了解HashMap HashMap的构造 两个参数的构造方法 一个参数的构造方法 不带参数的构造方法 哈希表初始化的长度 HashMap源码中的成员 Pt Get 了解HashMap 首先我们要明…...

Databend 开源周报 第 83 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.com 。Whats New探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。Support for WebHDFSHDFS 是大数…...

Spring | 基础

1. IOC和DI IOC&#xff1a;控制反转&#xff0c;其思想是反转资源获取的方向&#xff0c;传统的资源查找方式要求组件向容器发起请求查找资源&#xff0c;作为回应&#xff0c;容器适时的返回资源。而应用了 IOC 之后&#xff0c;则是**容器主动地将资源推送给它所管理的组件…...

windows7安装sql server 2000安装步骤 及安装过程中遇到的问题和解决方式

提示&#xff1a;文章写完后windows7安装sql server 2000安装步骤 及安装过程中遇到的问题和解决方式&#xff0c; 文章目录一、ms sql server 2000是什么&#xff1f;版本简介&#xff1a;**特点&#xff1a;****优点&#xff1a;**二、步骤1.下载安装包及Sq4补丁包2.安装 ms …...

Python 开发-批量 FofaSRC 提取POC 验证

数据来源 学习内容和目的&#xff1a; ---Request 爬虫技术&#xff0c;lxml 数据提取&#xff0c;异常护理&#xff0c;Fofa 等使用说明---掌握利用公开或 0day 漏洞进行批量化的收集及验证脚本开发Python 开发-某漏洞 POC 验证批量脚本---glassfish存在任意文件读取在默认4…...

Linux系统中部署软件

目录 1.Mysql 2.Redis 3.ZooKeeper 声明 致谢 1.Mysql 参考&#xff1a;CentOS7安装MySQL 补充&#xff1a; ① 执行&#xff1a;rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 再执行&#xff1a;yum -y install mysql-community-server ② mysql…...

PHP常用框架介绍与比较

HP是一种广泛应用于Web开发的编程语言。随着互联网的快速发展,PHP的应用场景变得越来越广泛,从简单的网站到复杂的Web应用程序都可以使用PHP来开发。为了更好地组织和管理PHP代码,开发人员经常会使用框架来提高开发效率和代码质量。 本文将介绍一些常用的PHP框架,并进行简…...

Umi + React + Ant Design Pro 项目实践(一)—— 项目搭建

学习一下 Umi、 Ant Design 和 Ant Design Pro 从 0 开始创建一个简单应用。 首先&#xff0c;新建项目目录&#xff1a; 在项目目录 D:\react\demo 中&#xff0c;安装 Umi 脚手架&#xff1a; yarn create umi # npm create umi安装成功&#xff1a; 接下来&#xff0c;…...

MySQL知识点总结(1)

目录 1、sql、DB、DBMS分别是什么&#xff0c;他们之间的关系&#xff1f; 2、什么是表&#xff1f; 3、SQL语句怎么分类呢&#xff1f; 4、导入数据 5、什么是sql脚本呢&#xff1f; 6、删除数据库 7、查看表结构 8、表中的数据 10、查看创建表的语句 11、简单的查询…...

day45第九章动态规划(二刷)

今日任务 70.爬楼梯(进阶)322.零钱兑换279.完全平方数 70.爬楼梯(进阶) 题目链接&#xff1a; https://leetcode.cn/problems/climbing-stairs/description/ 题目描述&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...