LibreOJ 6177 题解(状压DP)
题面
分析
刚看到这道题时想的是跟最短哈密顿路类似的二进制状压DP,先用floyd处理距离
但是此题用二进制不够,应该用三进制
0,1,2分别表示未送,正在送,已送完
dp[s][i]表示当前送到任务状态为s,现在在点i
状态转移方程见代码
时间复杂度\(O(n^3+3^qqn\)
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxs 60000
#define maxn 22
#define INF 0x3f3f3f3f
using namespace std;
int n,m,q;
int pow3[maxs];
int dp[maxs][maxn];
int dist[maxn][maxn];
int s[maxn];
int t[maxn];
int l[maxn];
int r[maxn];
void floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
}
}
}
}
int main(){
int u,v,w;
scanf("%d %d %d",&n,&m,&q);
memset(dist,0x3f,sizeof(dist));
for(int i=1;i<=m;i++){
scanf("%d %d %d",&u,&v,&w);
dist[u][v]=min(dist[u][v],w);
}
for(int i=1;i<=n;i++) dist[i][i]=0;
floyd();
for(int i=1;i<=q;i++){
scanf("%d %d %d %d",&s[i],&t[i],&l[i],&r[i]);
}
pow3[0]=1;
for(int i=1;i<=q;i++){
pow3[i]=pow3[i-1]*3;
}
memset(dp,0x3f,sizeof(dp));
dp[0][1]=0;
int ans=0,cnt=0;
for(int i=0;i<pow3[q];i++){//状态
for(int j=1;j<=n;j++){//当前位置
if(dp[i][j]==INF) continue;
cnt=0;
for(int k=1;k<=q;k++){
int digit=(i/pow3[k-1])%3;
if(digit==0){//开始送一个快递k,从当前位置j到第k个任务的起点s[k],i的第k位由0变1
//和l[k]取min是处理到的太早,要等到l[k]时刻才能领到货物
dp[i+pow3[k-1]][s[k]]=min(dp[i+pow3[k-1]][s[k]],max(dp[i][j]+dist[j][s[k]],l[k]));
}else if(digit==1){//送完快递k,从当前位置j到第k个任务的结束点t[k],i的第k位由1变2
//注意判断dp[i][j]+dist[j][t[k]]<=r[k],因为必须要在r[k]时刻前送完货物
if(dp[i][j]+dist[j][t[k]]<=r[k]) dp[i+pow3[k-1]][t[k]]=min(dp[i+pow3[k-1]][t[k]],dp[i][j]+dist[j][t[k]]);
}else cnt++;
}
ans=max(ans,cnt);
}
}
printf("%d\n",ans);
}
LibreOJ 6177 题解(状压DP)的更多相关文章
- O - Matching 题解(状压dp)
题目链接 题目大意 给你一个方形矩阵mp,边长为n(n<=21) 有n个男生和女生,如果\(mp[i][j]=1\) 代表第i个男生可以和第j个女生配对 问有多少种两两配对的方式,使得所有男生和 ...
- [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)
[BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...
- NOIP2017 宝藏 题解报告【状压dp】
题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但是 ...
- TZOJ 2289 Help Bob(状压DP)
描述 Bob loves Pizza but is always out of money. One day he reads in the newspapers that his favorite ...
- 【bzoj5161】最长上升子序列 状压dp+打表
题目描述 现在有一个长度为n的随机排列,求它的最长上升子序列长度的期望. 为了避免精度误差,你只需要输出答案模998244353的余数. 输入 输入只包含一个正整数n.N<=28 输出 输出只包 ...
- TZOJ 4912 炮兵阵地(状压dp)
描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...
- POJ 1684 Corn Fields(状压dp)
描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ ...
- 【uoj#37/bzoj3812】[清华集训2014]主旋律 状压dp+容斥原理
题目描述 求一张有向图的强连通生成子图的数目对 $10^9+7$ 取模的结果. 题解 状压dp+容斥原理 设 $f[i]$ 表示点集 $i$ 强连通生成子图的数目,容易想到使用总方案数 $2^{sum ...
- Codeforces Beta Round #8 C. Looking for Order 状压dp
题目链接: http://codeforces.com/problemset/problem/8/C C. Looking for Order time limit per test:4 second ...
- 【bzoj2560】串珠子 状压dp+容斥原理
题目描述 有 $n$ 个点,点 $i$ 和点 $j$ 之间可以连 $0\sim c_{i,j}$ 条无向边.求连成一张无向连通图的方案数模 $10^9+7$ .两个方案不同,当且仅当:存在点对 $(i ...
随机推荐
- Python之路-函数基础&局部变量与全局变量&匿名函数&递归函数&高阶函数
一.函数的定义与调用 函数:组织好的.可重复使用的.用户实现单一或者关联功能的代码段.函数能够提高应用的模块性和代码的重复利用率.Python提供了很多内置的函数,比如len等等,另外也可以根据自己的 ...
- Linux--shell grep与正则表达式--04
一.grep程序 Linux下有文本处理三剑客:grep.sed.awk grep:文本 行过滤工具 sed:文本 行编辑器(流编辑器) awk:报告生成器(做文本输出格式化) 1.grep grep ...
- Linux下安装Dubbox
1.Dubbox简介 Dubbox 是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续 ...
- Codeforces Round #340 (Div. 2) E. XOR and Favorite Number (莫队)
题目链接:http://codeforces.com/contest/617/problem/E 题目大意:有n个数和m次查询,每次查询区间[l, r]问满足ai ^ ai+1 ^ ... ^ aj ...
- less:匹配模式
相当于JS中的if(不完全是),满足条件后才能匹配 .margin(top, @width: 5px) { margin: @width 0 0 0; } .margin(right, @width: ...
- 理解Promise (1)
new Promise 需要传递一个执行器 (函数) 函数有两个参数 resolve reject promise 承诺 默认的状态是pengding 调用 resolve 表示成功 reject 表 ...
- HTML5 Canvas(实战:绘制饼图2 Tooltip)
继上一篇HTML5 Canvas(实战:绘制饼图)之后,笔者研究了一下如何给饼图加鼠标停留时显示的提示框. Plot对象 在开始Coding之前,笔者能够想到的最easy的方式,就是给饼图的每一个区域 ...
- k8s+jenkins
1 server 的port , targetport, nodeport的区别 targetport为容器的暴露端口,为最后端的端口 port可以理解为pod的端口,pod是容器的外层,该端口可以在 ...
- Spring---数据访问
1.Spring Data概述 1.1.Spring Data 项目 是 Spring用来解决数据访问问题 的一站式解决方案,包含了 大量关系型数据库.非关系型数据库 的 数据访问解决方案 ...
- 二叉搜索树第k个节点
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x ...