HDU1074 Doing Homework 状态压缩dp
题目大意:
根据完成任务的截止时间,超时一天罚1分,求完成所有任务后的最小罚时
这里n最大为15,可以利用状态压缩来解决问题
/*
首先要明白的一点是状态1/0分别表示这件事做了还是没做
而1/0的位置表示这是哪一件事
比如说 5 可以表示为101,那么表示第一个和第三个任务已经完成
而dp[5]表示第一个和第三个任务完成所花费的最短时间
而状态5(101)是从状态1(001)或者状态4(100)转移过来的
也就是说我们总是可以通过一个较小的状态不断递推一个较大状态的dp值 dp[j] = min(dp[i] , dp[j]) j=i|(1<<k) (0<=k<n)
也就是说我从 i 这个状态上又完成了第 k 件任务后达到了状态 j 另外我们要记录任务的顺序,我利用的是rec[]数组,rec[i]表示
在第i个状态时最后完成的任务的序号,假设n=5,然后我就可以从
11111这个状态开始不断往前记录一个个任务的序号 */
#include <cstdio>
#include <cstring>
#include <iostream> using namespace std;
const int MAXN = <<;
//_time[i]记录状态i时完成任务的总时间
int id[MAXN+] , dp[MAXN+] , _time[MAXN+] , rec[MAXN+] , rev[];
char str[][];
int D[] , C[]; int main()
{
// freopen("a.in" , "r" , stdin);
int T;
scanf("%d" , &T);
while(T--)
{
int n;
scanf("%d" , &n);
for(int i=; i<n ; i++){
scanf("%s%d%d" , str[i] , D+i , C+i);
}
int all = <<n; //状态总数
memset(dp , 0x3f , sizeof(dp));
//0状态表示什么都没做,自然扣除的分数为0
dp[] = ;
memset(_time , , sizeof(_time));
//从小状态不断往前可以不断更新更大状态的值
for(int i= ; i<all ; i++){
//有n个任务,一个个检测哪个任务可以接在状态i的后面去做
for(int j= ; j<n ; j++){
int s = <<j;
if(!(i&s)){
int state = i|s , add;
_time[state] = _time[i] + C[j];
add = _time[state]-D[j]>?_time[state]-D[j]:;//判断这个新任务加进来是否要被罚时
//dp[state] = min(dp[state] , dp[i]+add);
//更新rec[],后面一个条件是因为要按字典序排列,所以碰到值相等的情况,往往取较小的那个
if(dp[state] > dp[i]+add || (dp[state] == dp[i]+add && strcmp(str[j] , str[rec[state]])>=)){
dp[state] = dp[i]+add;
rec[state] = j;
}
}
}
} printf("%d\n" , dp[all-]); int st = all - ;
//逆序的,所以要用rev[]重新记录反过来的顺序
for(int i= ; i<n ; i++){
int index = rec[st] ;
rev[n-i-] = index;
st -= (<<index);
}
//依次输出
for(int i= ; i<n ; i++)
printf("%s\n" , str[rev[i]]);
}
return ;
}
HDU1074 Doing Homework 状态压缩dp的更多相关文章
- hdu1074 Doing Homework(状态压缩DP Y=Y)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- HDU 1074 Doing Homework (状态压缩 DP)
题目大意: 有 n 项作业需要完成,每项作业有上交的期限和需完成的天数,若某项作业晚交一天则扣一分.输入每项作业时包括三部分,作业名称,上交期限,完成所需要的天数.求出完成所有作业时所扣掉的分数最少, ...
- D - Doing Homework 状态压缩 DP
Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every ...
- Doing Homework 状态压缩DP
Doing Homework 题目抽象:给出n个task的name,deadline,need. 每个任务的罚时penalty=finish-deadline; task不可以同时做.问按怎样的 ...
- HDU 1074 Doing Homework(状态压缩DP)
题意:有n门课,每门课有截止时间和完成所需的时间,如果超过规定时间完成,每超过一天就会扣1分,问怎样安排做作业的顺序才能使得所扣的分最小 思路:二进制表示. #include<iostream& ...
- HDU1074(KB12-D 状态压缩dp)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU1074(状态压缩DP)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- hdu1074 状态压缩dp+记录方案
题意: 给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路: 状态压缩dp,记录方案数的地方 ...
- 状态压缩dp问题
问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...
随机推荐
- Kruskal HDOJ 4313 Matrix
题目传送门 题意:如何花最小的代价使得一棵树划分开且不含同类节点 分析:当一条边连接的左右集合同类点小于等于1,那么不用删除,将两个集合合并,要求最小代价,那么贪心思想将权值降序排序,删除后剩下的就是 ...
- how-to-fix-fs-re-evaluating-native-module-sources-is-not-supported-graceful
http://stackoverflow.com/questions/37346512/how-to-fix-fs-re-evaluating-native-module-sources-is-not ...
- redis持久化和分布式实现
Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势. 本文使用的redis是3.2.1版本.下载后,文件如下 将文件解压到指 ...
- Java 线程 —— Wait (等待)和 Notify(唤醒)
Wait (等待)和 Notify(唤醒) 这里讲了一个Wait (等待)和 Notfity(唤醒),下面这个实例(工厂,商店,消费者) 额,然后,你就知道了,需要写三个类:工厂类,Shop类,消费者 ...
- Solr和Spring Data Solr
一.Solr概述与安装 1.Solr简介 Solr是一个开源搜索平台,用于构建搜索应用程序. 它建立在Lucene(全文搜索引擎)之上. Solr是企业级的,快速的和高度可扩展的.Solr可以和Had ...
- Oracle Mysql的jdbc连接
Oracle和MySql的jdbc或连接池中的连接,写下来以便随时参考 Oracle: driverClassName=oracle.jdbc.driver.OracleDriver url=jdbc ...
- mysql解压缩方式安装和彻底删除
一.安装mysql (1)将下载下来的mysql压缩文件解压缩到需要安装mysql的目录中 (2)打开解压后的文件夹,复制default.ini文件并重命名为my.ini,此文件的相关配置为: (3) ...
- 手动配置wamp环境(1)--apache安装与基本操作
Apache服务器简介: Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一. 安装apac ...
- 关于Qt模态框总汇
转载请注明出处:http://www.cnblogs.com/dachen408/p/7285710.html 父窗体为QMainWindow: 当子窗体为: 1.QWidget,需要设置 this- ...
- HTTP/2 带来的新颖
Binary Frames HTTP2 在TCP层之上 HTTP下增加了Binary Frames协议, 基于该协议HTTP Request/Response 可以被分拆成由Frame组成的Strea ...