hdu 1074 Doing Homework 压缩dp
来源:互联网 发布:三国战记电脑mac版 编辑:程序博客网 时间:2024/04/27 21:02
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074
一,题意:
给你N个课程,每一个课程由三部分组成 名字,最后期限,完成所需时间,当你完成某一个
课程在最后期限以后,会被扣分,扣的分数就是超出的的时间,并且要求当扣分相同的情况
下要以字典序输出。
二,分析:
如果不需要以字典序输出的话我们可以用0 1背包可以解决,为了解决字典序这一问题我们应用
压缩dp,将所有课程压缩成一个整数的二进制,1表示已完成,0表示未完成。
对于某个状态如果有多个状态可以到达该状态且扣的分数相同,这时我们要考虑字典序问题
其实我们只要比较其前驱状态大小就可以了,二进制小的字典序一定小。
且我们还记录下每个状态前驱,为了还原路径。
三,代码:
#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>using namespace std;const int Max=(1<<15)-1;struct node{ int pre;//前驱 int time;//到该状态结束时间 int cost;//到该状态所扣的分数};node dp[Max];bool used[Max];//标记某个状态是否计算过int T,N;int End[20];//课程结束时间int need[20];//完成课程所需要的时间char name[20][105];//课程名字void DFS(int state){//打印最终路径 int key=dp[state].pre^state; int num=0; key>>=1; while(key) { num++; key>>=1; } if(dp[state].pre) DFS(dp[state].pre); printf("%s\n",name[num]);}int main(){ scanf("%d",&T); while(T--) { scanf("%d",&N); for(int i=0;i<N;i++) scanf("%s%d%d",name[i],&End[i],&need[i]); memset(used,false,sizeof(used)); dp[0].cost=0;//初始化 dp[0].pre= -1; dp[0].time=0; used[0]=true; int bian=(1<<N)-1;//边界即最大状态 for(int pre=0;pre<bian;pre++) {//前驱状态 for(int k=0;k<N;k++) {//下一个要做的课程 int cnt=1<<k; if(!(pre&cnt)) {//判断课程是否已经在前驱状态完成了 int hou=pre|cnt; int time=dp[pre].time+need[k]; int loss=time-End[k]; if(loss<0) loss=0; loss+=dp[pre].cost; if(used[hou]) { if(loss<dp[hou].cost) { dp[hou].cost=loss; dp[hou].pre=pre; dp[hou].time=time; } else if(loss==dp[hou].cost) { if(dp[hou].pre>pre) { dp[hou].pre=pre; dp[hou].time=time; } } } else { dp[hou].cost=loss; dp[hou].pre=pre; dp[hou].time=time; used[hou]=true; } } } } printf("%d\n",dp[bian].cost); DFS(bian); } return 0;}
0 0
- hdu 1074 Doing Homework(dp+状态压缩)
- HDU 1074 Doing Homework (状态压缩DP)
- hdu 1074 Doing Homework (状态压缩 + DP)
- HDU-1074 Doing Homework 状态压缩DP
- HDU 1074 Doing Homework(状态压缩DP)
- hdu 1074 Doing Homework(状态压缩dp)
- hdu 1074 Doing Homework dp+状态压缩
- hdu 1074 状态压缩+DP Doing Homework
- HDU 1074 Doing Homework 状态压缩DP
- hdu 1074 Doing Homework 状态压缩dp
- Hdu 1074 Doing Homework 状态压缩DP
- hdu 1074 Doing Homework 压缩dp
- 状态压缩DP-HDU-1074-Doing Homework
- HDU 1074 Doing Homework DP 状态压缩
- hdu 1074 Doing Homework 状态压缩dp
- HDU 1074 Doing Homework(状态压缩dp)
- hdu 1074 doing homework(状态压缩dp)
- hdu 1074 Doing Homework 状态压缩DP
- jquery mobile常用的data-role类型
- 解决undefined reference to `pthread_create'的方法
- Performance Log
- PAT 1006部分A+B
- 复杂网络 有关节点
- hdu 1074 Doing Homework 压缩dp
- 前序遍历+中序遍历生成二叉树
- Hadoop,HBase,Storm,Spark到底是什么?
- 空合运算符 ??(Nil Coalescing Operator)
- HDU - 2546 饭卡
- android数据恢复
- 素数判断算法(高效率)
- 排序算法思想及代码
- Gulp安装及使用