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/ ...
随机推荐
- java io读书笔记(4)字符数据
Number只是java程序中需要读出和写入的一种数据类型.很多java程序需要处理有一大堆的字符组成的text,因为计算机真正懂得的只有数字,因此,字符按照某种编码规则,和数字对应. 比如:在ASC ...
- [原创]spring学习笔记:关于springsource-tool-suite插件的安装
1.首先我们得确定自己使用的eclipes的版本,具体方式:打开eclipes > help > About Eclipes > 点击eclipes的logo > 查看ecli ...
- 构造器Constructor是否可被override?
构造器Constructor是否可被override? 构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading.
- UVALive 6145 Version Controlled IDE(可持久化treap、rope)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- codeforces 70D Professor's task(动态二维凸包)
题目链接:http://codeforces.com/contest/70/problem/D Once a walrus professor Plato asked his programming ...
- XMLHttpRequest Level2实现跨域
Html5提供的XMLHttpRequest Level2已经实现的跨域访问以及一些新功能 1.ie10以下版本不支持 2.在服务器端做一些小改动即可: header("Access-Con ...
- 包括post,get请求(http,https)的HttpClientUtils
package cn.knet.data.untils; import java.io.IOException; import java.net.SocketTimeoutException; imp ...
- 夺命雷公狗ThinkPHP项目之----企业网站25之网站前台面包屑导航URL的完善
如果想取出面包屑导航的url那么就必须在model层里面进行多取一个了: <?php namespace Home\Model; use Think\Model; class CategoryM ...
- 省市区三级联动(二)JS部分简单版
通过对上一篇<省市区三级联动>的学习发现JScript部分省市区的填充代码几乎相同,所以可以写成一个函数. 注意:html部分和chuli.php部分不变 1.下拉列表填充可以写成带参数的 ...
- 前端单页应用SEO解决方案
在这里只会提到Google的解决方案,日后再补充百度的解决方案 我们经常使用的单页都是#!来做应用的前端路由,因为这个在多个版本浏览器上有很好的兼容性 当Google发现URL里有#!符号,Googl ...