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 ...
随机推荐
- AngularJs调用NET MVC 控制器中的函数进行后台操作
题目中提到的控制器指的是.NET MVC的控制器,不是angularjs的控制器. 首先看主页面的代码: <!DOCTYPE html> <html> <head> ...
- Styles and Themens(3)android所有主题表
The Android platform provides a large collection of styles and themes that you can use in your appli ...
- 加权平均值 WAvg”
https://wenku.baidu.com/view/13d974fff8c75fbfc77db2d3.html
- Stamus Networks的产品SELKS(Suricata IDPS、Elasticsearch 、Logstash 、Kibana 和 Scirius )的下载和安装(带桌面版和不带桌面版)(图文详解)
不多说,直接上干货! SELKS是什么? SELKS 是Stamus Networks的产品,它是基于Debian的自启动运行发行,面向网络安全管理.它基于自己的图形规则管理器提供一套完整的.易于使 ...
- 开发一个 Web App 必须了解的那些事
在过去的一年里,我在从头开始开发我的第一个重要的Web应用.经验教会了很多以前不知道的东西,特别是在安全性和用户体验方面. 值得一提的是,我上一次尝试构建的任何合理复杂性是在2005年.所以,在安全防 ...
- FastDFS的简单使用
互联网中有海量的文件,比如电商网站有海量的图片文件,视频网站有海量的视频文件,如果使用传统的模式上传文件,肯定是不可取的.因此需要使用第三方服务器来存储图片 . 一.FastDFS简介 FastD ...
- P1440 求m区间内的最小值
题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入输出格式 输入格式: 第一行两个 ...
- jQuery 几款比较棒的插件
jQuery滚动监听插件Waypoints 博客分类: Javascript /Jquery / Bootstrap / Web 你是否希望当用户仅仅滚动滑条的时候,就能触发各种各样的动态效果呢? ...
- Farseer.net轻量级ORM开源框架 V1.3版本升级消息
SHA-1: abca3b99801648fa23c7f4934de6c128f042cf47 * 提交新版本:V1.31.重构:FS.Mapping命名空间移到 FS.Core.Map中2.重构:对 ...
- php常用的一些代码
1.获取用户真实ip function getIP() { if (getenv("HTTP_X_FORWARDED_FOR")) { // 这个提到最前面,作为优先级,nginx ...