loj #6177. 「美团 CodeM 初赛 Round B」送外卖2 状压dp floyd
LINK:#6177.美团 送外卖2
一道比较传统的状压dp题目.
完成任务 需要知道自己在哪 已经完成的任务集合 自己已经接到的任务集合。
考虑这个dp记录什么 由于存在时间的限制 考虑记录最短时间 因为时间越短 对于任务来说越优。
考虑设f[i][j][k]表示已经做完的任务为i接受的任务为j上次做的任务为k.
虽然看起来状态数为\(2^q\cdot 2^q\cdot q\)但是考虑j枚举的只是i的补集的子集 所以这样做状态数为\(3^q\cdot q\)
复杂度需要多乘一个q枚举决策 \(3^q\cdot q^2\)
看起来能过的样子 但是空间爆了 原因是空间复杂度是上述的分析.
考虑hash发现很难hash的不重复 这个时候考虑三进制状压因为一个任务有三种状态 所以三进制状压是一种很好的hash.
这样优化过空间之后就能过了.
const int MAXN=11,maxn=21;
int n,m,Q,ans;
int a[maxn][maxn],v[60010];
int f[60010][MAXN],bas[maxn];
struct wy{int s,t,l,r;}t[maxn];
int main()
{
//freopen("1.in","r",stdin);
get(n);get(m);get(Q);
memset(a,0x3f,sizeof(a));
memset(f,0x3f,sizeof(f));
rep(1,m,i)
{
int x,y,z;
get(x);get(y);get(z);
a[x][y]=min(a[x][y],z);
}
bas[0]=1;
rep(1,n,i)a[i][i]=0;
rep(1,n,k)rep(1,n,i)rep(1,n,j)a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
rep(1,Q,i)
{
int get(s1);int get(s2);
int get(s3);int get(s4);
t[i]=(wy){s1,s2,s3,s4};
bas[i]=bas[i-1]*3;
}
rep(1,Q,i)f[bas[i-1]][i]=max(a[1][t[i].s],t[i].l);
rep(1,bas[Q]-1,i)
{
v[i]=v[i/3]+(i%3==2);
rep(1,Q,j)
{
if(f[i][j]>INF)continue;
int st;ans=max(ans,v[i]);
if(i/bas[j-1]%3==1)st=t[j].s;
else st=t[j].t;
rep(1,Q,k)
{
if(i/bas[k-1]%3==0)
{
int ss=i+bas[k-1];
if(f[i][j]+a[st][t[k].s]<=t[k].r)f[ss][k]=min(f[ss][k],max(f[i][j]+a[st][t[k].s],t[k].l));
}
if(i/bas[k-1]%3==1)
{
int ss=i+bas[k-1];
if(f[i][j]+a[st][t[k].t]<=t[k].r)f[ss][k]=min(f[ss][k],f[i][j]+a[st][t[k].t]);
}
}
}
//puts("");
}
put(ans);
return 0;
}
loj #6177. 「美团 CodeM 初赛 Round B」送外卖2 状压dp floyd的更多相关文章
- loj6177 「美团 CodeM 初赛 Round B」送外卖2 最短路+状压dp
题目传送门 https://loj.ac/problem/6177 题解 一直不知道允不允许这样的情况:取了第一的任务的货物后前往配送的时候,顺路取了第二个货物. 然后发现如果不可以这样的话,那么原题 ...
- 【loj6177】「美团 CodeM 初赛 Round B」送外卖2 Floyd+状压dp
题目描述 一张$n$个点$m$条边的有向图,通过每条边需要消耗时间,初始为$0$时刻,可以在某个点停留.有$q$个任务,每个任务要求在$l_i$或以后时刻到$s_i$接受任务,并在$r_i$或以前时刻 ...
- Loj #6164. 「美团 CodeM 初赛 Round A」数列互质
link : https://loj.ac/problem/6164 莫队傻题,直接容斥做. #include<bits/stdc++.h> #define maxn 100005 #de ...
- #6164. 「美团 CodeM 初赛 Round A」数列互质-莫队
#6164. 「美团 CodeM 初赛 Round A」数列互质 思路 : 对这个题来言,莫队可以 n*根号n 离线处理出各个数出现个的次数 ,同时可以得到每个次数出现的次数 , 但是还要处理有多少 ...
- 「美团 CodeM 初赛 Round A」最长树链
题目描述 Mr. Walker 最近在研究树,尤其是最长树链问题.现在树中的每个点都有一个值,他想在树中找出最长的链,使得这条链上对应点的值的最大公约数不等于1.请求出这条最长的树链的长度. 输入格式 ...
- 【填坑】loj6159. 「美团 CodeM 初赛 Round A」最长树链
水一水 枚举各个质数,把是这个数倍数的点留下,跑直径,没了 #include <bits/stdc++.h> using namespace std; int h,t,n,p,q,M,N; ...
- LiberOJ#6178. 「美团 CodeM 初赛 Round B」景区路线规划 概率DP
题意 游乐园被描述成一张 n 个点,m 条边的无向图(无重边,无自环).每个点代表一个娱乐项目,第 i 个娱乐项目需要耗费 ci 分钟的时间,会让小 y 和妹子的开心度分别增加 h1i ,h2i ,他 ...
- 「美团 CodeM 初赛 Round A」试题泛做
最长树链 树形DP.我们发现gcd是多少其实并不重要,只要不是1就好了,此外只要有一个公共的质数就好了.计f[i][j]表示i子树内含有j因子的最长链是多少.因为一个数的不同的质因子个数是log级别的 ...
- [LOJ 6213]「美团 CodeM 决赛」radar
[LOJ 6213]「美团 CodeM 决赛」radar 题意 给定 \(n\) 个横坐标 \(x_i\) , 为它们选择一个不超过 \(y_i\) 的纵坐标 \(h_i\), 产生 \(c_ih_i ...
随机推荐
- Buffer的创建及使用源码分析——ByteBuffer为例
目录 Buffer概述 Buffer的创建 Buffer的使用 总结 参考资料 Buffer概述 注:全文以ByteBuffer类为例说明 在Java中提供了7种类型的Buffer,每一种类型的Buf ...
- 「树形DP」洛谷P2607 [ZJOI2008]骑士
P2607 [ZJOI2008]骑士 题面: 题目描述 Z 国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的 ...
- git clone远程仓库的指定分支
正常clone方式 git clone <远程仓库地址> 默认clone的是远程仓库的master分支 clone指定分支 git clone -b <分支名> <远程仓 ...
- Python 的print报错SyntaxError: invalid syntax
1. #!/usr/bin/python print "hello world!" print报错:SyntaxError: Missing parentheses in call ...
- Java入门系列之final
前言 在C#经典面试中掺杂过Java的final关键字,主要用于类不能被继承,在C#则是利用关键字seal修饰类为密封类,而在Java中的final关键字的具体用法包含C#中const.readonl ...
- day28 封装
目录 一.什么是封装 二.将封装的属性进行隐藏操作 1 如何隐藏: 1.1 强行访问: 1.2 内部逻辑 三.为何要封装 一.什么是封装 封装是面向对象的三大特性中最核心的一个特性 封装<==& ...
- vue-cli3安装
1.如果原来安装过vue-cli,需要先卸载,命令:npm uninstall vue-cli -g :这步如果出现问题,可能是npm 的全局路径被更改, 运行如下命令:npm config set ...
- drf权限,频率,过滤,排序,异常处理
目录 一.权限 1 权限源码分析 2 自定义权限类 3 内置权限类 二.频率 1 内置频率设置 三.过滤 四.排序 五.异常处理 一.权限 1 权限源码分析 # APIView---->disp ...
- Python-break/continue
break:用于终止整个循环 continue:用于终止本次循环,而不终止整个循环的执行
- SpringMVC中@RequestBody接收前端传来的多个参数
在使用ajax发送请求时,如果发送的JSON数据是一个类中的不同属性,在Controller方法中使用@RequestBody会直接封装进该类中 例如: 前端部分代码 JavaScript <s ...