hdu1074 Doing Homework
这题比较有意思,暴力搜索必然tle,可以用状态压缩dp解决。
我们先不考虑完成所有作业的扣分,而考虑其一个子集的情况。
假设我们得到了完成某子集S对应的作业最少扣分,我们试着向该子集中增加一个元素a,那么我们将得到一个新的集合S1。
从而f(S1) = min(g(S')), S'⊂S, 且#(S') = #(S) - 1。
其中g函数仅依赖于集合S'与元素e = (S - S')。
如果我们能够在处理S之前将其所有真子集都处理完毕,那么S可以直接由原状态导出。
于是当更新到S为全集的时候,答案也就得到了。
考虑用二进制表示状态,二进制数某一位为1或0代表同位次的元素属于(不属于)该集合。
所有子集的数值大小都比原集合小。
将二进制数从小到大扫描一遍即可。
这就是所谓的状态压缩dp。
复杂度O(n * 2^n)。
acm.hdu.edu.cn/showproblem.php?pid=1074#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
typedef __int64 LL; const int inf = 0x3f3f3f3f;
const int maxn = + ;
const int maxm = << ; char s[][maxn];
int n, high;
struct Node{
int t, dl;
}node[maxn];
int dp[maxm];
int tc[maxm], pre[maxm], ans[]; void print(){
printf("%d\n", dp[high]);
int p = high, k = ;
while(p){
ans[k++] = pre[p];
p -= << pre[p];
}
for(int i = k - ; i >= ; i--) puts(s[ans[i]]);
} int main(){
int T;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
for(int i = ; i < n; i++){
scanf("%s%d%d", s[i], &node[i].dl, &node[i].t);
}
high = ( << n) - ;
memset(dp, inf, sizeof dp);
dp[] = ;
for(int i = ; i <= high; i++){
for(int j = n - ; j >= ; j--){
int tem = << j;
//update the current state by enumerating the new element
if(tem & i){
//i is the current state while (i - tem) is the previous state
int p = max(, node[j].t + tc[i - tem] - node[j].dl);
if(p + dp[i - tem] < dp[i]){
dp[i] = p + dp[i - tem];
tc[i] = node[j].t + tc[i - tem];
pre[i] = j;
}
}
}
}
print();
}
return ;
}
hdu1074 Doing Homework的更多相关文章
- 状态压缩-----HDU1074 Doing Homework
HDU1074 Doing Homework 题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当 ...
- hdu1074 Doing Homework(状态压缩DP Y=Y)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- kuangbin专题十二 HDU1074 Doing Homework (状压dp)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU1074 Doing Homework —— 状压DP
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1074 Doing Homework Time Limit: 2000/1000 MS (J ...
- HDU1074 Doing Homework 状态压缩dp
题目大意: 根据完成任务的截止时间,超时一天罚1分,求完成所有任务后的最小罚时 这里n最大为15,可以利用状态压缩来解决问题 /* 首先要明白的一点是状态1/0分别表示这件事做了还是没做 而1/0的位 ...
- HDU1074 Doing Homework(状压dp)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意:给定有n门课的作业,每门课交作业有截止时间,和完成作业所花费的时间,如果超过规定时间完成,每超 ...
- 「kuangbin带你飞」专题十二 基础DP
layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...
- HDU1074:Doing Homework(状压DP)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU 1074 Doing Homework (动态规划,位运算)
HDU 1074 Doing Homework (动态规划,位运算) Description Ignatius has just come back school from the 30th ACM/ ...
随机推荐
- mysql:innodb monitor(show engine innodb status)探秘
在旧的版本里面是show innodb status命令,新版本后改动了一些:show engine innodb status; 我们最熟悉的,应当就是show innodb status命令,可以 ...
- java collections读书笔记(11) Lists
继续这个系列,好久没学习了,懒惰呀. Set接口,实际上是collection 类别中最简单的一个接口,因为它并没有比Collection 接口增加任何的内容,相对而言,大家可能更喜欢List接口和它 ...
- 使用Navicat for Oracle新建表空间、用户及权限赋予---来自烂泥
Navicat for Oracle是有关Oracle数据库的客户端工具.通过这个客户端,我们可以图形方式对Oracle数据库进行操作. 说 明我们此次试验的Oracle数据库版本是Oracle 10 ...
- poj 1731 Orders
http://poj.org/problem?id=1731 Orders Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9 ...
- clock gate cell
clock gate的cell多采用latch的形式,来实现,尽可能避免glitch的产生. 可以的verilog建模方式: module cell_ckgate(TE,E,CP,Q) input ...
- SQL优化SQL tuning
1. 索引不合适,走主键进行了key lookup查找 说明索引没有覆盖到where条件 或者 orderby 或者 group by的列
- linux 压缩文件的命令总结
Linux压缩文件的读取 *.Z compress 程序压缩的档案: *.bz2 bzip2 程序压缩的档案: *.gz gzip 程序压缩的档案: *.tar ...
- 《zw版·Halcon-delphi系列原创教程》 3d汽车模型自动区域分割
<zw版·Halcon-delphi系列原创教程> 3d汽车模型自动区域分割 目前,图像分析,在3D设计,机器视觉方面拥有很广.这个Halcon脚本是3d汽车模型自动区域分割,很简单才20 ...
- 项目中empty遇到的一个问题
搜索传参时,数据能获取到,搜索结果不是根据参数得出的,在定义搜索条件时因为empty引起的一个问题,键为0的值没有获取到, 记住:!empty 已经把0排除了
- Ceph的状态错误
使用命令检查ceph集群的监控状态,得到 [root@node1 ~]# ceph -s cluster c4898b1c-7ac1-406d-bb5d-d3c7980de438 health HEA ...