备战2023蓝桥国赛-移动服务

2023-10-26

题目描述:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解析:
这道题我想复杂了,一开始我是这样想的:设dp[i][j]表示按顺序满足到第i个请求时,最初在j号点的人到达第i个请求的位置的情况下的最小花费,state[i][j]表示按顺序满足到第i个请求时,最初在j号点的人到达第i个请求的位置的情况下的各个人的位置状态,状态转移方程就为dp[i][j]=dp[i-1][k]+g[a][requested_loc[i]],然后就wa了。。。10个过了2.
之后我就一直用这个方法来想,始终过不了,后面不得不看题解。
看完题解后我才发现我一直有个思维误区,那就是必须把原先在1,2,3号点的位置改变要具体表示出来,而且是精确到顺序,正因为这个我一直没有想出正确解法,但其实大可不必如此,题目是求最小值,又不是求到达终点后原先在1,2,3号点各点的精确位置,没必要精确表示原先在1,2,3号点的位置信息,只需大致表示出来就行。
这道题的正确解法是:设f[i][x][y]表示已经处理完前i个请求,且三个服务员分别在p[i], x, y的所有方案的集合,f[i][x][y]的值是集合中所有方案的花费的最小值,那么动态转移方程就为:
位于p[i]的服务员出发前往p[i + 1],此时状态变成f[i + 1][x][y] = f[i][x][y] + w[p[i]][p[i + 1]];
位于x的服务员出发前往p[i + 1],此时状态变成f[i + 1][p[i]][y] = f[i][x][y] + w[x][p[i + 1]];
位于y的服务员出发前往p[i + 1],此时状态变成f[i + 1][x][p[i]] = f[i][x][y] + w[y][p[i + 1]];最终答案从f[m][1…n][1…n]取最小值即可。
错误代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1010,L=210;
int dp[N][5],state[N][5];//dp[i][j]表示按顺序满足到第i个请求时,最初在j号点的人到达第i个请求的位置的情况下的最小花费 
//state[i][j]表示按顺序满足到第i个请求时,最初在j号点的人到达第i个请求的位置的情况下的各个人的位置状态, 
//比如最初在1号点、2号点和3号点的人此时分别在4,5,6号点,那么4*200*200+5*200+6=161006,即state[i][j]=161006。 
int g[L][L]; //存图 
int requested_loc[N];
int n,l;
int main()
{
	scanf("%d%d",&l,&n);
	for(int i=1;i<=l;i++)
	{
		for(int j=1;j<=l;j++)
		scanf("%d",&g[i][j]);
	}
	for(int i=1;i<=n;i++) scanf("%d",&requested_loc[i]);
	
	memset(dp,0x3f,sizeof(dp));
	
	if(requested_loc[1]!=2&&requested_loc[1]!=3)
	{
		dp[1][1]=g[1][requested_loc[1]];
		state[1][1]=201*201*requested_loc[1]+201*2+3;
	}
	
	
	if(requested_loc[1]!=1&&requested_loc[1]!=3)
	{
		dp[1][2]=g[2][requested_loc[1]];
		state[1][2]=201*201*1+201*requested_loc[1]+3;
	}
	
	
	if(requested_loc[1]!=1&&requested_loc[1]!=2)
	{
		dp[1][3]=g[3][requested_loc[1]];
		state[1][3]=201*201*1+201*2+requested_loc[1];
	}
	
	/*
	for(int j=1;j<=3;j++)
	{
		int temp=state[1][j];
		int a=temp/40000,b=temp%40000/200,c=temp%40000%200;
		printf("各点位置:%d %d %d dp[1][%d]的值为:%d\n",a,b,c,j,dp[1][j]); 
	}*/
	
	
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<=3;j++)
		{
			for(int k=1;k<=3;k++)
			{
				int temp=state[i-1][k];
				int a=temp/40401,b=temp%40401/201,c=temp%40401%201;
				//cout<<a<<" "<<b<<" "<<c<<endl;
				if(j==1)
				{
					if(requested_loc[i]!=b&&requested_loc[i]!=c)
					{
						if(dp[i][j]>dp[i-1][k]+g[a][requested_loc[i]])
						{
							dp[i][j]=dp[i-1][k]+g[a][requested_loc[i]];
							state[i][j]=201*201*requested_loc[i]+201*b+c;
						}
					}
					
				}
				else if(j==2) 
				{
					if(requested_loc[i]!=a&&requested_loc[i]!=c)
					{
						if(dp[i][j]>dp[i-1][k]+g[b][requested_loc[i]])
						{
							dp[i][j]=dp[i-1][k]+g[b][requested_loc[i]];
							state[i][j]=201*201*a+201*requested_loc[i]+c;
						}
					}
					
				}
				else {
					if(requested_loc[i]!=a&&requested_loc[i]!=b)
					{
						if(dp[i][j]>dp[i-1][k]+g[c][requested_loc[i]])
						{
							dp[i][j]=dp[i-1][k]+g[c][requested_loc[i]];
							state[i][j]=201*201*a+201*b+requested_loc[i];
						}
					}
					
				}
			}
			/*
			int temp=state[i][j];
			int a=temp/40000,b=temp%40000/200,c=temp%40000%200;
			printf("各点位置:%d %d %d dp[%d][%d]的值为:%d\n",a,b,c,i,j,dp[i][j]); */
		}
	}
	int res=min(dp[n][1],min(dp[n][2],dp[n][3]));
	cout<<res;
	return 0;
}

正确代码:

#include<bits/stdc++.h>
using namespace std;
const int L=210,N=1010,INF=0x3f3f3f3f;
int g[L][L],f[N][L][L],p[N];
int main()
{
	int l,n;
	scanf("%d%d",&l,&n);
	for(int i=1;i<=l;i++)
	{
		for(int j=1;j<=l;j++)
		scanf("%d",&g[i][j]);
	}
	for(int i=1;i<=n;i++) scanf("%d",&p[i]);
	memset(f,0x3f,sizeof(f));
	p[0]=1;
	f[0][2][3]=0;
	for(int i=0;i<n;i++)
	{
		for(int x=1;x<=l;x++)
		{
			for(int y=1;y<=l;y++)
			{
				int z=p[i];
				if(x==y||x==z||y==z) continue;
				int v=f[i][x][y];
				f[i+1][x][y]=min(f[i+1][x][y],v+g[p[i]][p[i+1]]);//p[i]->p[i+1]
				f[i+1][z][y]=min(f[i+1][z][y],v+g[x][p[i+1]]);//x->p[i+1]
				f[i+1][x][z]=min(f[i+1][x][z],v+g[y][p[i+1]]);//y->p[i+1]
			}
		}
	}
	int res=INF;
	for(int x=1;x<=l;x++)
	{
		for(int y=1;y<=l;y++)
		{
			int z=p[n];
			if(x==y||x==z||y==z) continue;
			res=min(res,f[n][x][y]);
		}
	}
	cout<<res;
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

备战2023蓝桥国赛-移动服务 的相关文章

  • 如何实现算法中的公平性

    机器学习的公平性问题近几年受到越来越多的关注 该领域出现了一些新的进展 机器学习训练在涉及到性别 种族等与人相关的敏感属性时 常常会由于统计性偏差 算法本身甚至是人为偏见而引入歧视性行为 由此 为消除差别影响 改进机器学习公平性 主要途径包
  • 在jsp中实现表格内设置滚动框

    当我们在页面中需要放置多条数据时 滚动框则将是一个十分不错的选择 在需要加入滚动框的表格内设置标签 table tbody style display block tbody table

随机推荐

  • 利用Python实现卷积神经网络的可视化

    对于深度学习这种端到端模型来说 如何说明和理解其中的训练过程是大多数研究者关注热点之一 这个问题对于那种高风险行业显得尤为重视 比如医疗 军事等 在深度学习中 这个问题被称作 黑匣子 Black Box 如果不能解释模型的工作过程 我们怎么
  • C#网络编程,多个客户端连接服务器端并发送消息

    最近学习进度到了C 网络编程 在学习这一章节的知识点 写了一些小demo 此次发表的为服务器监听端口 和多个客户端连接 获取多个客户端发来的消息 服务器端代码 using System Net using System Net Socket
  • SQL Server迭代求和

    drop table t geovindu create table t geovindu xid int IDENTITY 1 1 price money DebitCredit VARCHAR 2 adate datetime defa
  • Android学习之 Scroller的介绍与使用

    类概述 Android里Scroller类是为了实现View平滑滚动的一个Helper类 通常在自定义的View时使用 在View中定义一个私有成员mScroller new Scroller context 设置mScroller滚动的位
  • 微服务工程搭建过程中的注意点

    1 父工程pom xml文件 1 父工程的maven坐标 2 packaging使用pom 原因 在Spring Cloud微服务工程中 通常会采用多模块的方式进行开发 父工程的pom文件中的packaging标签设置为pom 是因为父工程
  • Spring Framework 入门(一)

    Spring Framework各模块作用介绍 可以参考spring framework的github项目 源码地址 https github com spring projects spring framework 下面我们分别了解下各个
  • SQL所有关键字及其作用:

    以下是MySQL的所有关键字及其作用 ADD 在表中添加新的列或索引 ALL 返回满足条件的所有行 包括重复行 ALTER 修改表的结构 如添加 修改或删除列 ANALYZE 分析并收集表的统计信息 用于优化查询 AND 用于多条件查询的逻
  • wedo2.0编程模块介绍_西门子S7-200 SMART硬件和编程软件简介

    前文给大家简单的讲介绍了一下PLC编程涉及的一些概念型知识 本文开始实践 今天带来的是SIMATIC S7 200 SMART硬件和编程软件简介 SIMATIC S7 200 SMART 是西门子公司经过大量市场调研 为中国客户量身定制的一
  • Java 多线程 --- 按序打印

    Java 多线程 按序打印 方法1 控制变量 使用volatile关键字优化 方法2 synchronized wait notifyAll 方法3 信号量 给你一个类 public class Foo public void first
  • 【深度学习】参数量、模型大小、显存

    对于一个深度学习神经网络来说 其通常包含很多卷积层 用于不断提取目标的特征 或对目标进行最终定位或者分类 1 数据存储精度与存储空间 在深度学习神经网络中 最常见的数据格式是float32 占4个字节 Byte 类似地 float16 占2
  • std::condition_variable

    std condition variable std condition variable 是C 11提供的条件变量 可用于同时阻塞一个线程或多个线程 一般的 生产者线程利用支持std mutex的std lock guard std un
  • 【React Hook】一文让你彻底明白何为State Hook?

    使用 State Hook 下面的例子介绍了 Hook import React useState from react function Example 声明一个叫 count 的 state 变量 const count setCoun
  • 如何解除计算机的启动项,UEFI安全启动怎么关闭 关闭UEFI启动项的方法图解

    大家都知道现在很多电脑都预装win8系统 其系统都开启了UEFI安全启动选项 然而 对于不习惯win8操作界面的朋友来说 可能就会把win8改为win7 但是我们得知道Win8改装Win7需要在BIOS下关闭UEFI选项 如果OS选项已经关
  • ctfshow-萌赛

    目录 web 签到 给她 假声赛 web 签到 很明显的命令执行漏洞 我们把前后闭合即可 payload 1 ls 1 1 cat flag 1 给她 根据题目提示很容易就想到是 git泄露 直接用gitHack扫描题目地址 git 发现存
  • 电子科技大学人工智能期末复习笔记(二):MDP与强化学习

    目录 前言 期望最大搜索 Expectimax Search 马尔科夫决策 MDP offline 超重点 先来看一个例子 基本概念 政策 Policy 折扣 Discounting 如何停止循环 价值迭代 Value Iteration
  • LeetcodeSQL入门——知识点总结(选择/排序/修改/字符串处理/正则)

    LeetcodeSQL入门 选择 排序 修改 字符串处理 选择 sql语言对于空值的判断是IS NULL或者IS NOT NULL eg 某网站包含两个表 Customers 表和 Orders 表 编写一个 SQL 查询 找出所有从不订购
  • 剑指Offer 40

    使用优先队列 将非负数变为非正数存储 结果变成非负数 class Solution public int getLeastNumbers int arr int k if k 0 return new int 0 int nums new
  • SequenceInputStream----合并流

    这个类的作用是将多个输入流合并成一个输入流 通过SequenceInputStream类包装后形成新的一个总的输入流 1 SequenceInputStream InputStream s1 InputStream s2 和Sequence
  • 差分方程与滤波的实现

    1 滤波基础知识 2 差分方程 3 IIR滤波器 1 直接I型IIR滤波器 2 直接II型IIR滤波器
  • 备战2023蓝桥国赛-移动服务

    题目描述 解析 这道题我想复杂了 一开始我是这样想的 设dp i j 表示按顺序满足到第i个请求时 最初在j号点的人到达第i个请求的位置的情况下的最小花费 state i j 表示按顺序满足到第i个请求时 最初在j号点的人到达第i个请求的位