题目链接


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 + 状态压缩 + 剪枝)相关推荐

  1. uva10160(dfs+状态压缩)

    题意:给出n个点,以及m条边,这些边代表着这些点相连,修一个电力站,若在某一点修一个站,那么与这个点相连的点都可以通电,问所有的点都通电的话至少要修多少个电力站........ 思路:最多给出的是35 ...

  2. hdu 3681(bfs+dfs+状态压缩)

    解题思路:这道题属于图上来回走的问题,可以把重复走的过程弱化,即只强调从u->v的结果,中间经过的节点都不考虑.这道题里面'G','F','Y'是重要的节点,其余的点我们是可以忽略的,也就是说, ...

  3. 洛谷P1562 还是N皇后(DFS+状态压缩+位运算)

    八皇后问题的介绍在此不再赘述,只贴一下经典八皇后问题的实现代码(参考刘汝佳 <算法竞赛入门经典>) void search(int i) {if(i>n){ans++;return; ...

  4. 状态压缩+dfs+背包

    状态压缩dp 状态压缩dp就是用二进制数字来表示状态,通过遍历所有状态确定答案,时间复杂度为o(nn2^n),通常只能用来解数据范围小于等于21的. P1433 吃奶酪 #include <bi ...

  5. 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩

    文章目录 题目解答 题目链接 题目解答 分析: 此题和笔者另一篇博文很像,只不过是限定了个数.<算法竞赛进阶指南>打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归.二进 ...

  6. POJ2688状态压缩(可以+DFS剪枝)

    题意:       给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路:       水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...

  7. LeetCode 1723. 完成所有工作的最短时间(DFS+剪枝 / 状态压缩DP)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 状态压缩DP 265 / 3871, 前6.85% 前3题题解: LeetCode 5649. 解码异或后的数组(位运算) LeetCode ...

  8. DFS 简单的剪枝和状态压缩 海贼王之伟大航路

    今天碰到了这样一道题目,是一个关于深搜的题目 4124:海贼王之伟大航路 查看 提交 统计 提示 提问 总时间限制:  1000ms  内存限制:  65536kB 描述 "我是要成为海贼王 ...

  9. 《算法竞赛进阶指南》打卡-基本算法-AcWing 94. 递归实现排列型枚举:dfs、二进制状态压缩

    文章目录 题目解答 题目来源 题目解答 分析: dfs求全排列,这里是用二进制状态压缩进行优化,二进制状态压缩,顾名思义,每个状态是用二进制的某一位表示.这里的体现是state这个状态,它的每一位代表 ...

  10. 《算法竞赛进阶指南》打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归、二进制状态压缩、dfs

    文章目录 题目解答 题目链接 题目解答 分析: 优化:用二进制状态压缩,也就是用二进制上的位来记录数有没有被用过. ac代码 #include<bits/stdc++.h> using n ...

最新文章

  1. 模型部署到移动端_谷歌开源 MobileNetV3:新思路 AutoML 改进计算机视觉模型移动端...
  2. 127.Word Ladder
  3. brave浏览器_火狐联创、Java Script之父,居然也来倒腾区块链浏览器?
  4. linux bogomips,内核探索:Linux BogoMips 探秘
  5. Hibernate:1对1关系总结。
  6. Java类权限和类成员权限举例解析
  7. Dreamweaver8 V8.0.0.2766
  8. sql解决数据库日志文件过大的问题
  9. 顺序表的定义和基本操作
  10. opencv-牛刀小试
  11. oracle中的userenv,Oracle 中的userenv()
  12. 数字取证二 熟练掌握鉴证大师 了解NTFS分析、LogFile文件使用和USN日志分析
  13. Delphi Web前端开发教程(2):基于TMS WEB Core框架
  14. CMS是Content Management System的缩写,意为内容管理系统。
  15. python-报错集合
  16. 老李分享:robotium常用API
  17. 专业导论-课后总结-2019.11.29
  18. i.MX6ULL终结者Linux设备树DTS设备树语法结构
  19. 佰马智慧灯杆管理运维平台
  20. 如何设置电脑定时自动关机

热门文章

  1. [JAVA]使用Jersey处理Http协议中的Multipart
  2. 二级联动菜单(转载)
  3. (论坛答疑点滴)怎么给Table动态添加控件并且得到控件的值?
  4. EMNLP'21 | Dialogue System 对话系统
  5. 让人深思:句法真的重要吗?邱锡鹏组提出一种基于Aspect的情感分析的强大基线...
  6. 【知识图谱系列】基于生成式的知识图谱预训练模型
  7. 【干货笔记】Generating Question-Answer Hierarchies阅读笔记
  8. 【机器学习】如何处理数据不均衡问题
  9. 每日算法系列【LeetCode 1004】最大连续1的个数 III
  10. 《MYSQL必知必会》—3~9.使用MySQL、检索数据列、排序检索数据列、过滤数据(WHERE子句、组合WHERE子句、通配符、正则表达式)