690 - Pipeline Scheduling (DFS + 状态压缩 + 剪枝)
题目链接
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=631
题目大意
有 5 个不同的工作单元,10 个相同的程序,每个程序需要运行 n 个时间段,每个时间段需要一个工作单元工作。现在问至少需要多少时间,才可以执行完全部的程序。
解题过程
大体思路就是暴力模拟,显然可以状态压缩用位运算,然后就是剪枝的问题了。
最开始想的是最暴力的模拟,从移一位开始试,如果可以移动了就 break 掉,这样找的每一步都是最短的,但总体上不是最优的。
然后就去删掉了 break ,循环到移动 n 位。
最后还是超时,又加了如果当前长度加上后面的最少长度大于答案就剪掉,还是超时,不过这里到是用的 IDA* 换了直接 DFS 还是超时。
于是去找了博客……
题目分析
以后做题的时候要考虑下,暴力 dfs 时候,每一个状态到下一个状态的路径个数,可不可以优化,感觉这题的思想类似 KMP 先预处理可以走的步长,避免以后很多次的判断。
- 有两次剪枝
- 一是开始就初始化一下,仅有两个任务的情况每次可以移动的步长。这样比直接暴力移动省了不少时间。
- 二是如果当前还需要运行的程序个数乘最短步长后,如果大于当前的结果,那么剪掉。
- 每次的状态用一个一位数组储存,每个工作单元用状态压缩一个整数表示。
- 每次检测好移动用位运算。
AC代码
#include<bits/stdc++.h>
using namespace std;const int MAX = 30;char rawData[6][MAX];
int data[MAX], n, ans, jump[MAX], cnt;bool judge(int A[], int k) {for (int i = 0; i < 5; i++) {if ((A[i]>>k)&data[i])return false;}return true;
}void codingData(int n) {ans = n*10, cnt = 0;memset(data, 0, sizeof(data));for (int i = 0; i < 5; i++) {scanf("%s", rawData[i]);for (int j = 0; j < n; j++) {if (rawData[i][j] == 'X') {data[i] |= (1<<j);}}}for (int i = 0; i <= n; i++) {if (judge(data, i))jump[cnt++] = i;}
}void attempt(int dep, int A[], int pos) {if (pos + (10 - dep) * jump[0] > ans)return;if (dep == 10) {ans = min(pos, ans);return;}for (int i = 0; i < cnt; i++) {if (judge(A, jump[i])) {int B[MAX] = {};for (int j = 0; j < 5; j++) {B[j] = (A[j]>>jump[i]) | data[j];}attempt(dep+1, B, pos + jump[i]);}}
}int main() {while (~scanf("%d", &n) && n) {codingData(n);attempt(1, data, n);printf("%d\n", ans);}
}
转载于:https://www.cnblogs.com/ACMFish/p/7222855.html
690 - Pipeline Scheduling (DFS + 状态压缩 + 剪枝)相关推荐
- uva10160(dfs+状态压缩)
题意:给出n个点,以及m条边,这些边代表着这些点相连,修一个电力站,若在某一点修一个站,那么与这个点相连的点都可以通电,问所有的点都通电的话至少要修多少个电力站........ 思路:最多给出的是35 ...
- hdu 3681(bfs+dfs+状态压缩)
解题思路:这道题属于图上来回走的问题,可以把重复走的过程弱化,即只强调从u->v的结果,中间经过的节点都不考虑.这道题里面'G','F','Y'是重要的节点,其余的点我们是可以忽略的,也就是说, ...
- 洛谷P1562 还是N皇后(DFS+状态压缩+位运算)
八皇后问题的介绍在此不再赘述,只贴一下经典八皇后问题的实现代码(参考刘汝佳 <算法竞赛入门经典>) void search(int i) {if(i>n){ans++;return; ...
- 状态压缩+dfs+背包
状态压缩dp 状态压缩dp就是用二进制数字来表示状态,通过遍历所有状态确定答案,时间复杂度为o(nn2^n),通常只能用来解数据范围小于等于21的. P1433 吃奶酪 #include <bi ...
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩
文章目录 题目解答 题目链接 题目解答 分析: 此题和笔者另一篇博文很像,只不过是限定了个数.<算法竞赛进阶指南>打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归.二进 ...
- POJ2688状态压缩(可以+DFS剪枝)
题意: 给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路: 水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...
- LeetCode 1723. 完成所有工作的最短时间(DFS+剪枝 / 状态压缩DP)
文章目录 1. 题目 2. 解题 2.1 DFS 2.2 状态压缩DP 265 / 3871, 前6.85% 前3题题解: LeetCode 5649. 解码异或后的数组(位运算) LeetCode ...
- DFS 简单的剪枝和状态压缩 海贼王之伟大航路
今天碰到了这样一道题目,是一个关于深搜的题目 4124:海贼王之伟大航路 查看 提交 统计 提示 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 "我是要成为海贼王 ...
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 94. 递归实现排列型枚举:dfs、二进制状态压缩
文章目录 题目解答 题目来源 题目解答 分析: dfs求全排列,这里是用二进制状态压缩进行优化,二进制状态压缩,顾名思义,每个状态是用二进制的某一位表示.这里的体现是state这个状态,它的每一位代表 ...
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归、二进制状态压缩、dfs
文章目录 题目解答 题目链接 题目解答 分析: 优化:用二进制状态压缩,也就是用二进制上的位来记录数有没有被用过. ac代码 #include<bits/stdc++.h> using n ...
最新文章
- 模型部署到移动端_谷歌开源 MobileNetV3:新思路 AutoML 改进计算机视觉模型移动端...
- 127.Word Ladder
- brave浏览器_火狐联创、Java Script之父,居然也来倒腾区块链浏览器?
- linux bogomips,内核探索:Linux BogoMips 探秘
- Hibernate:1对1关系总结。
- Java类权限和类成员权限举例解析
- Dreamweaver8 V8.0.0.2766
- sql解决数据库日志文件过大的问题
- 顺序表的定义和基本操作
- opencv-牛刀小试
- oracle中的userenv,Oracle 中的userenv()
- 数字取证二 熟练掌握鉴证大师 了解NTFS分析、LogFile文件使用和USN日志分析
- Delphi Web前端开发教程(2):基于TMS WEB Core框架
- CMS是Content Management System的缩写,意为内容管理系统。
- python-报错集合
- 老李分享:robotium常用API
- 专业导论-课后总结-2019.11.29
- i.MX6ULL终结者Linux设备树DTS设备树语法结构
- 佰马智慧灯杆管理运维平台
- 如何设置电脑定时自动关机
热门文章
- [JAVA]使用Jersey处理Http协议中的Multipart
- 二级联动菜单(转载)
- (论坛答疑点滴)怎么给Table动态添加控件并且得到控件的值?
- EMNLP'21 | Dialogue System 对话系统
- 让人深思:句法真的重要吗?邱锡鹏组提出一种基于Aspect的情感分析的强大基线...
- 【知识图谱系列】基于生成式的知识图谱预训练模型
- 【干货笔记】Generating Question-Answer Hierarchies阅读笔记
- 【机器学习】如何处理数据不均衡问题
- 每日算法系列【LeetCode 1004】最大连续1的个数 III
- 《MYSQL必知必会》—3~9.使用MySQL、检索数据列、排序检索数据列、过滤数据(WHERE子句、组合WHERE子句、通配符、正则表达式)