hdu1074 状压DP、栈实现记录路径
题意:给了几门学科作业、它们的截止提交期限(天数)、它们的需要完成的时间(天数),每项作业在截止日期后每拖延一天扣一学分,算最少扣的学分和其完成顺序。
一开始做的时候,只是听说过状态压缩这个神奇的东西,但事实上我并不会用它,所以白白想了一个晚上没想出来,然后就看了一下题解```再见吧朋友又是新的算法要学了。
状态压缩,实际上就是用二进制的方式,对于每一个要考察的状态用0/1表示其完成与否,这样当从 1 遍历到 111```111 的时候,就可以遍历完所有的状态了,在遍历的过程中利用位运算以及状态转移就能够最终实现DP。
首先对于每一个状态 i 初始化其罚分为最大值用于最开始的比较,用 & 运算来判断它的其中某项作业 j 是否已经完成,完成则 & 运算结果为 1 ,否则为 0 ,若已完成,那么考察 j 作业未完成的情况 last ,如果从 last 状态的罚分加上完成作业 j 后的罚分小于当前 i 状态的罚分,则更新 i 状态的罚分情况,并且记录下到 i 状态时做的作业 j 、 i 的上一状态 last 、i 状态的已花费时间,便于进行状态转移和记录路径。最后用栈从全部作业完成时 111`````111 的状态开始通过记录的上一状态往前递推,输出作业次序。
收获颇丰,但是心力交瘁```代码中间绿绿的是调试的时候用的```因为我蠢```
#include<stdio.h>
#include<string.h>
#include<stack>
#include<algorithm>
#define INF 1<<30
using namespace std;
struct Sub{
char name[];
int d,t;
}S[]; struct dpl{
int t,s,p,n;
}dp[<<]; int main(){
int T;
while(scanf("%d",&T)!=EOF){
int N;
for(int q=;q<=T;q++){
scanf("%d",&N);
memset(dp,,sizeof(dp));
int i,j;
for(i=;i<=N;i++){
scanf("%s%d%d",S[i].name,&S[i].d,&S[i].t);
}
/* for(i=1;i<=N;i++){ printf("%s %d %d",S[i].name,S[i].d,S[i].t);
}*/
int sum=(<<N)-,sub,last,pun;
/* printf("%d ",sum);
while(sum){
printf("%d",sum&1);
sum>>=1;
}
printf("\n");*/
for(i=;i<=sum;i++){
dp[i].s=INF;
for(j=N;j>;j--){
sub=<<(j-);
if(i&sub){
last=i-sub;
pun=dp[last].t+S[j].t-S[j].d;
if(pun<)pun=;
if(pun+dp[last].s<dp[i].s){
dp[i].s=pun+dp[last].s;
dp[i].t=dp[last].t+S[j].t;
dp[i].p=last;
dp[i].n=j;
}
}
}
}
stack<int>s;
int t=sum;
printf("%d\n",dp[t].s);
while(t){
s.push(dp[t].n);
t=dp[t].p;
}
while(!s.empty()){
printf("%s\n",S[s.top()].name);
s.pop();
}
}
}
return ;
}
hdu1074 状压DP、栈实现记录路径的更多相关文章
- HDU 4539郑厂长系列故事――排兵布阵(状压DP)
HDU 4539 郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 //#pragma co ...
- Codeforces 453B Little Pony and Harmony Chest:状压dp【记录转移路径】
题目链接:http://codeforces.com/problemset/problem/453/B 题意: 给你一个长度为n的数列a,让你构造一个长度为n的数列b. 在保证b中任意两数gcd都为1 ...
- 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)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- CH0103最短Hamilton路径 & poj2288 Islands and Brigdes【状压DP】
虐狗宝典学习笔记: 取出整数\(n\)在二进制表示下的第\(k\)位 \((n >> ...
- HDU1074 Doing Home Work - 状压dp
传送门 题目大意: 有n(\(\le 15\))个作业,每个作业有个name, deadline(截止日期),cost(做作业花的时间),如果没有按时完成某个作业,惩罚分数为超出的时间,求一个合理的顺 ...
- 最短Hamilton路径(状压dp)
最短Hamilton路径实际上就是状压dp,而且这是一道作为一个初学状压dp的我应该必做的题目 题目描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 ...
- 【状压dp】Hamiton路径
描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点 ...
- HDU 1074:Doing Homework(状压DP)
http://acm.hdu.edu.cn/showproblem.php?pid=1074 Doing Homework Problem Description Ignatius has just ...
随机推荐
- JSON.parse()和eval()区别
JSON.parse()只会将标准的Json字符串(key和value都由双引号引起来,最外面用单引号括住)转为JSON对象. eval()在转换字符串的时候是比较松的,即使不是标准的Json字符串也 ...
- [Swift2.0系列]Defer/Guard 基础语法
1.Defer Swift2.0中加入了defer新语法声明.defer译为延缓.推迟之意.那么在Swift2.0中它将被应用于什么位置呢?比如,读取某目录下的文件内容并处理数据,你需要首先定位到文件 ...
- VMware Workstation 10.0.0.1295980 CN
从V10版本开始,VMware Workstation 官方自带简体中文了,以后大家不需要汉化啦! Winner of more than 50 industry awards, VMware Wor ...
- Linux内核-链表
linux内核链表的定义(定义了双向链表,不含数据域) 定义在 /linux-source-3.13.0/include/linux/types.h 头文件中. struct list_head { ...
- Ubuntu 14.10 下安装Synergy,不同电脑之间公用一套键盘鼠标
因为工作时候有多台电脑放在一起,如果每个用一套键盘鼠标很是不方便,所以希望能够不用电脑之间公用一套键盘鼠标. Synergy可以实现不同电脑之间公用一套键盘鼠标,并且支持简单的复制粘贴.很好用. 它还 ...
- UE正则表达式查找和替换(将【,;】)替换为换行
- 微信分享 添加URL Schemes
1. TARGETS - Info - URL Types identifier -> weixin URL Schemes -> 应用id 2.在AppDelegate.h 引入头文件 ...
- Java私有构造器
Java私有构造器:使用private关键字声明的构造函数.由于类的构造函数时私有的,所以此类不能被实例化,同时也不能被继承.<Effective Java>第三条:用私有构造器或者枚举强 ...
- Interview----链表的倒数第K个元素
这个题虽然简单,但是一定要细心,bug-free 能力很重要. 分析: 如果不知道链表的长度,可以采用双指针的方法,让一个指针先走 k 步,然后两个指针同时走, 前面的指针变成 NULL时, 第一个指 ...
- PHP_ArrayList
<?php //遍历数组的2种方式 $arr=array( "1"=>"hello", "2"=>"my&q ...