题解【AcWing274】移动服务
非常好的优化 \(\text{DP}\) 状态表示的题目。
首先可以设 \(dp_{i,x,y,z}\) 表示已经做完了前 \(i\) 个请求,现在的 \(3\) 名服务员分别在 \(x\) 、\(y\) 、\(z\) 处的最小花费。
然而这样做时间和空间都会爆炸。
考虑如何优化。
我们注意到做完第 \(i\) 个请求时一定会有一个服务员停留在 \(p_i\) 处,于是可以压掉一维状态。
所以状态就变成了 \(dp_{i,x,y}\) 表示做完了前 \(i\) 个请求,另外 \(2\) 个服务员分别在 \(x\) 和 \(y\) 处的最小花费。
转移的话,枚举下一个请求是由谁做,加上他的位置与下一个请求的位置之间的花费即可。
#include <bits/stdc++.h>
#define DEBUG fprintf(stderr, "Passing [%s] line %d\n", __FUNCTION__, __LINE__)
#define itn int
#define gI gi
using namespace std;
typedef long long LL;
typedef pair <int, int> PII;
typedef pair <int, PII> PIII;
inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return f * x;
}
const int maxn = 203, maxm = 1003;
int n, m, l, dp[maxm][maxn][maxn], c[maxm][maxm], p[maxm];
int main()
{
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
l = gi(), n = gi();
for (int i = 1; i <= l; i+=1)
{
for (int j = 1; j <= l; j+=1)
{
c[i][j] = gi();
}
}
for (int i = 1; i <= n; i+=1) p[i] = gi();
//dp 初始化
memset(dp, 0x3f, sizeof(dp));
p[0] = 3;
dp[0][1][2] = 0;
for (int i = 0; i < n; i+=1)
{
for (int x = 1; x <= l; x+=1)
{
for (int y = 1; y <= l; y+=1)
{
int z = p[i], nxt = p[i + 1];
if (x == y || x == z || y == z) continue;
dp[i + 1][x][y] = min(dp[i + 1][x][y], dp[i][x][y] + c[z][nxt]); //z 去做
dp[i + 1][z][y] = min(dp[i + 1][z][y], dp[i][x][y] + c[x][nxt]); //x 去做
dp[i + 1][x][z] = min(dp[i + 1][x][z], dp[i][x][y] + c[y][nxt]); //y 去做
}
}
}
int ans = 1000000003;
for (int x = 1; x <= l; x+=1)
{
for (int y = 1; y <= l; y+=1)
{
int z = p[n];
if (x == y || y == z || z == x) continue;
ans = min(ans, dp[n][x][y]);
}
}
printf("%d\n", ans);
return 0;
}
题解【AcWing274】移动服务的更多相关文章
- Acwing P274 移动服务 题解
每日一题 day21 打卡 Analysis DP的状态为已经完成的请求数量,通过指派一位服务员可以把”完成i - 1个请求的状态”转移到”完成i个请求的状态”那么我们可以知道转移从dp[i - 1] ...
- 1820: [JSOI2010]Express Service 快递服务
1820: [JSOI2010]Express Service 快递服务 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 847 Solved: 325 ...
- PAT 甲级真题题解(1-62)
准备每天刷两题PAT真题.(一句话题解) 1001 A+B Format 模拟输出,注意格式 #include <cstdio> #include <cstring> #in ...
- 【BZOJ1820】[JSOI2010]快递服务(动态规划)
[BZOJ1820][JSOI2010]快递服务(动态规划) 题面 BZOJ 洛谷 题解 考虑无脑四维\(dp\).\(f[i][a][b][c]\),表示当前处理到第\(i\)个任务,三辆车的位置分 ...
- 【BZOJ1820】[JSOI2010]Express Service 快递服务 暴力DP
[BZOJ1820][JSOI2010]Express Service 快递服务 Description 「飞奔」快递公司成立之后,已经分别与市内许多中小企业公司签订邮件收送服务契约.由于有些公司是在 ...
- Bzoj 1229: [USACO2008 Nov]toy 玩具 题解 三分+贪心
1229: [USACO2008 Nov]toy 玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 338 Solved: 136[Submit] ...
- ACM团队周赛题解(1)
这次周赛题目拉了CF315和CF349两套题. 因为我代码模板较长,便只放出关键代码部分 #define ll long long #define MMT(s,a) memset(s, a, size ...
- Vulnhub靶场题解
Vulnhub简介 Vulnhub是一个提供各种漏洞环境的靶场平台,供安全爱好者学习渗透使用,大部分环境是做好的虚拟机镜像文件,镜像预先设计了多种漏洞,需要使用VMware或者VirtualBox运行 ...
- Spring cloud微服务安全实战-4-1章节概述
过渡到复杂的微服务场景下面. 搭建起一个简单的微服务架构,一个网关,一个安全中心,两个微服务,然后会看到如何将安全相关的问题解构出来放在网关上. 然后与OAuth协议整合起来.
随机推荐
- linux之定时任务调度
crond:任务调度 任务调度:是指系统在某个时间执行特定的程序或命令 任务调度分类: (1)系统工作,有些重要的工作必须周而复始地进行,如病毒扫描等 (2)个别用户工作:个别用户可能希望执行某些程序 ...
- Remoting、WCF、WebAPI、WCFREST、WebService之间的区别与联系
在.net平台下,有大量的技术让你创建一个服务,像Web Service,WCF,Web API,Remoting,我们来对比一下他们的区别与联系 Remoting Web Service WCF W ...
- Wilson's Theorem
ProofsSuppose first that $p$ is composite. Then $p$ has a factor $d > 1$ that is less than or equ ...
- JN_0017:在当前目录运行CMD
运行npm的时候,每次都要cd到目录,很麻烦,所以总结了三种在当前目录下直接打开cmd窗口的方法,供以后开发时参考,相信对其他人也有用. 方法一 在当前目录按住shift再右键. 会看到右键菜单里有一 ...
- C#效率优化(4)-- 编译器对数组遍历的优化
在平时开发过程中,数组是我们使用频率最高的类型之一,在使用定长列表时,数组可以说是最佳方案,这也是我们最熟悉的数据结构之一. 在C#中使用数组,可以获取在内存上连续的相同类型的一组变量,在连续访问时可 ...
- 什么人适合学习Django?
什么人适合学习Django? 我觉得如果你能满足以下2个条件,你就可以果断地选择Django了. 你喜欢Python, 你对Web开发有热情. 学习Python和Django并不难,最重要的是你是否对 ...
- html点击圆形扩散显示界面特效
开场白 效果 用到的核心代码 思考 探索 源码 兼容性问题 开场白 经常看到某些app有点击扩散的特效,有些当做扩散显示界面,有些扩散改变主题颜色,想在网页上实现一下,所以就有了这个. 效果 不想听逼 ...
- P2048 [NOI2010]超级钢琴 [堆+st表]
考虑只能取长度为 [L,R] 的,然后不难想到用堆搞. 搞个前缀和的st表,里面维护的是一个 最大值的位置 struct rmq { int mx[N][20] ; void qwq(int n) { ...
- ROS开发--在订阅话题的回调函数中发布话题
处理激光数据时,需要将处理后的激光数据再发布,需要保持一致的频率,所以必须在回调函数中发布激光数据信息. 代码参考:https://blog.csdn.net/heyijia0327/article/ ...
- 服务起不来,查看ps axj 看服务是否为守护进程(TPGID 为-1)
在linux命令行中输入: ps axj 查看服务进程的 TPGID 字段的值是否为-1 ,为-1表示为守护进程 不为-1表示不是守护进程,服务启动不起来,或者启动起来后又被杀死了