今日份动态规划学习

news2024/11/18 11:38:10

主要只搞了一个这道题,有点摸鱼了今天晚上,也是来小看一下这道题吧
01背包+完全背包

P1941 [NOIP2014 提高组] 飞扬的小鸟

 

题意: 

这题是说,给我们一个游戏界面,界面的长度为n(水平距离),高度为m(竖直距离),然后有k个管子,告诉你他下沿部分长度和下沿部分长度,然后对于每单位的水平距离,都有相应的x[i]上升距离和y[i]下降距离,然后问你达到游戏地图的最右端的最小步数是多少,要是无法达到最右端,问你最多能通过几个管子

思路:

对于这题很明显是背包类问题,然后就是01背包+完全背包

首先,我们对于每单位位置都有两种操作,可以选择点击屏幕上升,也可以选择不点下降(两种状态,01背包)

我们对于每个位置的点也分为两种情况,可以选择只点一次,也可以选择,点击多次(完全背包)

那么我们就可以定义dp数组,dp[ i ] [ j ],表示到达位置i,j的最小步数为dp[ i ] [ j ]

然后我们的状态转移方程需要判断四种情况

(1)上升:dp[i][j]=min(dp[i-1][j-x[i]]+1,dp[i][j-x[i]]+1);

(2)上升到天花板:dp[i][m]=min(dp[i][m],dp[i][j]);

(3)下降:dp[i][j]=min(dp[i-1][j+y[i]],dp[i][j]);

(4)不合法的位置,一定会被拦截:dp[i][j]=dp[0][0];  

然后我们去判断最右端位置是否存在合法数值即可,如果存在则证明可以达到最右端,反之则不行,需要求出过几个管道,求管道的时候要逆序去找,先找哪一列存在合法数据,然后定位这个长度,去看这个长度里面有几个管子

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int x[10005];
int y[10005];
int low[10005];
int high[10005];
int dp[10005][2005];
int vis[10005];

int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)
	cin>>x[i]>>y[i];
	for(int i=1;i<=n;i++)
	{
		low[i]=1;
		high[i]=m;
	}
	int a,b,c;
	for(int i=1;i<=k;i++)
	{
		cin>>a>>b>>c;
		vis[a]=1;
		low[a]=b+1;
		high[a]=c-1;
	}
	memset(dp,0x3f3f3f3f,sizeof(dp));
	for(int j=1;j<=m;j++)
	dp[0][j]=0;
	
	for(int i=1;i<=n;i++)
	{
		for(int j=x[i]+1;j<=m+x[i];j++)
		{
			dp[i][j]=min(dp[i-1][j-x[i]]+1,dp[i][j-x[i]]+1);
		}
		
		for(int j=m+1;j<=m+x[i];j++)
		{
			dp[i][m]=min(dp[i][m],dp[i][j]);
		}
		
		for(int j=1;j<=m-y[i];j++)
		{
			dp[i][j]=min(dp[i-1][j+y[i]],dp[i][j]);
		}
		
		for(int j=1;j<low[i];j++)
		{
			dp[i][j]=dp[0][0];
		}
		for(int j=high[i]+1;j<=m;j++)
        {
        	dp[i][j]=dp[0][0];  
		}
	}
	int ans=0x3f3f3f3f;
	for(int j=1;j<=m;j++)
	{
		ans=min(dp[n][j],ans);
	}
	if(ans<0x3f3f3f3f)
	{
		cout<<1<<"\n";
		cout<<ans<<"\n";
	}
	else
	{
		int i,j;
		for(i=n;i>=1;i--)
		{
			for(j=1;j<=m;j++)
			{
				if(dp[i][j]<0x3f3f3f3f)
				break;
			}
			if(j<=m)
			break;
		}
		int sum=0;
		for(int j=1;j<=i;j++)
		{
			if(vis[j]==1)
			sum++;
		}
		cout<<0<<"\n";
		cout<<sum<<"\n";
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第134题加油站

题目&#xff1a; 题解&#xff1a; class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int n gas.length;int i 0;while (i < n) {int sumOfGas 0, sumOfCost 0;int cnt 0;while (cnt < n) {int j (i cnt) % n;sumOfGas gas[j];sumOfCos…

【活动】程序员的核心职业素养:技术与人文并重的探索之旅

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 程序员的核心职业素养&#xff1a;技术与人文并重的探索之旅1. 持续学习与技术精…

Python Lambda函数的应用实例教程

在Python编程中&#xff0c;lambda函数是一种简洁且强大的工具&#xff0c;用于创建小型匿名函数。它们在需要快速定义简单函数时特别有用。本文将详细介绍lambda函数的语法及其多种应用实例&#xff0c;帮助读者更好地理解和使用lambda函数。 一、lambda函数的基本概念 1.1 什…

多个p标签一行展示,溢出隐藏

一开始&#xff0c;我是让div包裹多个p标签&#xff0c;并让div“flex”布局&#xff0c;且单行溢出隐藏&#xff0c;可是发现当父元素或当前元素有flex时&#xff0c;text-overflow: ellipsis;是不生效的 大多数解决办法都是&#xff0c;不要flex&#xff0c;或者给div下的每个…

计算机网络 期末复习(谢希仁版本)第6章

DNS采用UDP。 DHCP 给运行服务器软件、且位置固定的计算机指派一个永久地址&#xff0c;给运行客户端软件的计算机分配一个临时地址

数据库(25)——多表关系介绍

在项目开发中&#xff0c;进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;各个表之间的结构基本上分为三种&#xff1a;一对多&#xff0c;多对多&#xff0c;一对一。 一对多 例如&#xff0c;一个学校可以有…

Web IDE 在线编辑器综合实践(Web IDE 技术探索 三)

前言 前面两篇文章&#xff0c;我们简单讲述了 WebContainer/api 、Terminal 的基本使用&#xff0c;离完备的在线代码编辑器就差一个代码编辑了。今天通过 monaco editor &#xff0c;来实现初级代码编辑功能&#xff0c;讲述的是整个应用的搭建&#xff0c;并不单独针对monac…

鸿蒙轻内核M核源码分析系列六 任务及任务调度(2)任务模块

任务是操作系统一个重要的概念&#xff0c;是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源&#xff0c;并独立于其它任务运行。鸿蒙轻内核的任务模块可以给用户提供多个任务&#xff0c;实现任务间的切换&#xff0c;帮助用户管理业务程序流程。…

设计模式-工厂方法(创建型)

创建型-工厂方法 简单工厂 将被创建的对象称为“产品”&#xff0c;将生产“产品”对象称为“工厂”&#xff1b;如果创建的产品不多&#xff0c;且不需要生产新的产品&#xff0c;那么只需要一个工厂就可以&#xff0c;这种模式叫做“简单工厂”&#xff0c;它不属于23中设计…

【PL理论】(5) F#:递归类型 | Immutability 特性(F#中值一旦定义就不会改变)

&#x1f4ad; 写在前面&#xff1a;本文旨在探讨不可变数据结构在 F# 编程中的应用&#xff0c;特别是如何利用递归记录类型来表示和操作数值表达式。通过定义存储整数的二叉树和数值表达式的类型&#xff0c;我们将展示不可变性如何简化程序的理解和维护。文章将对比 F# 与命…

LeetCode刷题之HOT100之搜索旋转排序数组

2024/6/2 雨一直下&#xff0c;一个上午都在床上趴着看完了《百年孤独》&#xff0c;撑伞去吃了个饭&#xff0c;又回到了宿舍。打开许久未开的老电脑&#xff0c;准备做题了。《百年孤独》讲了什么&#xff0c;想表达什么&#xff0c;想给读者留下什么&#xff0c;我不知道&am…

IP黑名单与IP白名单是什么?

在IP代理使用中&#xff0c;我们经常听到黑名单与白名单两个名词&#xff0c;它们不仅提供了强大的防御机制&#xff0c;还可以灵活应对不同的安全威胁。本文将详细探讨IP黑名单和白名单在网络安全中的双重屏障作用。 一、IP黑名单和白名单定义 IP黑名单与IP白名单是网络安全中…

2024会声会影全新旗舰版,下载体验!

在当今数字时代&#xff0c;视频内容已成为最受欢迎的媒介之一。无论是个人娱乐、教育还是商业推广&#xff0c;优秀的视频制作都是吸引观众的关键。为了满足广大用户对高质量视频制作软件的需求&#xff0c;我们隆重推出了会声会影2024最新旗舰版。这款软件不仅集成了最先进的…

六、SQL执行器的定义和实现

之前的Sql执行都是耦合在SqlSession里的&#xff0c;现在要对这部分进行解耦和重构&#xff0c;引申出执行器&#xff0c;查了相关概念&#xff0c;Executor执行器可以说是定义了一个个的SQL的执行流程&#xff0c;用查询方法举例&#xff0c;大概一下几步&#xff1a; 1.获取数…

基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真&#xff0c;输出收敛曲线以及三维曲面最高点搜索结果。 2.测试软件版本以及运行结果展示 MATLAB2022A版本…

OPPO 文件传输 - 将文件从 OPPO 手机传输到 PC 的 5 种方法

OPPO手机以其出色的拍照功能而闻名&#xff0c;尤其是新推出的OPPO Find X2系列&#xff0c;它配备了高清前置镜头和超夜景模式&#xff0c;让您轻松拍出精彩瞬间。当您需要将这些照片或其他文件从OPPO手机传输到PC时&#xff0c;以下是五种简便的方法。 第 1 部分&#xff…

掘金AI商战宝典-高阶班:如何用AI制作视频(11节视频课)

课程下载&#xff1a;掘金AI商战宝典-高阶班&#xff1a;如何用AI制作视频(11节视频课)-课程网盘链接提取码下载.txt资源-CSDN文库 更多资源下载&#xff1a;关注我。 课程目录&#xff1a; 1-第一讲用AI自动做视频(上)_1.mp4 2-第二讲用AI自动做视频(中)_1.mp4 3-第四讲A…

你真的理解补码了吗?

下面来看三句话&#xff1a; &#xff08;1&#xff09;一个数的补码等于原码取反加1 &#xff08;2&#xff09;减去一个数等于加这个数的补码 &#xff08;3&#xff09;一个数的反码就是这个数原码的每一位都取反 学过补码的同学应该都听过类似的表述&#xff0c;如果你…

使用迁移助手 (SSMA for Oracle) 将Oracle19c数据库迁移到SQL Server2022

如何使用适用于 Oracle 的 SQL Server 迁移助手Microsoft SQL Server Migration Assistant for Oracle (SSMA for Oracle) 将 Oracle 数据库迁移到 SQL Server Microsoft SQL Server Migration Assistant (SSMA) for Oracle is a tool to automate migration from Oracle data…

python数据分析——模型诊断

参考资料&#xff1a;活用pandas库 创建模型是持续性活动。当向模型中添加或删除变量时&#xff0c;需要设法比较模型&#xff0c;并需要统一的方法衡量模型的性能。 1、残差 模型的残差指实际观测值与模型估计值之差。 # 导入pandas库 import pandas as pd # 读取数据集 hou…