Doing Homework HDU - 1074
Doing Homework HDU - 1074
题意:
有n个任务,每个任务有一个截止时间,超过截止时间一天,要扣一个分。
求如何安排任务,使得扣的分数最少。
(1<=n<=15)
题解:
n很小,可以往状压dp方向去想
我们用i枚举所有的状态,然后对于第j个任务,tmp=i-(1<<j),tmp表示状态i在未完成j的前一个状态
tim[]表示当前状态所花费的时间,那么完成第j个任务所扣分数为score=tim[tmp]+cost[j]-dead[j],完成tmp所需时间+完成任务j所需时间-截止日期,超出多少扣多少分数
dp[i]表示i状态下的的最小扣分,dp[i]=min(dp[tmp]+score)
为了方便答案的输出,我们用pre[i]记录,最后一个完成状态i所办的任务,pre[i]=j,这样记录是为了之后方便输出,w=i-(1<<pre[i])就是在任务j之前的状态,然后依次寻找w-(1<<pre[w])
在循环任务j时,要从后向前找,因为题目所给的数据是字典序递增的,而我们最后的输出是根据pre倒着输出的,所以逆着寻找可以保证输出的字典序最小
代码:
我的代码不知道哪里错了,一直wa,先贴上网上的正代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<ctime>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 15
#define MOD 10007
#define E 1e-6
#define LL long long
using namespace std;
char str[20][101];
int dp[1<<N],pre[1<<N],times[1<<N];
int dead[N],cost[N];
void print(int x){//递归输出作业顺序if(!x)return;print(x-(1<<pre[x]));printf("%s\n",str[pre[x]]);
}
int main()
{int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);for(int i=0;i<n;i++)scanf("%s%d%d",&str[i],&dead[i],&cost[i]);memset(times,0,sizeof(times));memset(pre,0,sizeof(pre));for(int i=1;i<(1<<n);i++){//枚举所有状态dp[i]=INF;//初始化状态i的扣分for(int j=n-1;j>=0;j--){//从后向前找int temp1=1<<j;if(!(i&temp1))//状态i不存在作业j完成的情况continue;int temp2=i-temp1;//未完成作业j的状态int score=times[temp2]+cost[j]-dead[j];//计算扣分if(score<0)//最小扣分为0score=0;if(dp[i]>dp[temp2]+score){dp[i]=dp[temp2]+score;//记录最小扣分times[i]=times[temp2]+cost[j];//到达状态i所花费的时间pre[i]=j;//状态i的前驱}}}printf("%d\n",dp[(1<<n)-1]);print((1<<n)-1);}return 0;;
}
Doing Homework HDU - 1074相关推荐
- 动态规划训练16 [Doing Homework HDU - 1074 ]
Doing Homework HDU - 1074 这是一道状态压缩DP(从N <= 15就可以看出来). 我们定义二进制状态S代表的是目前已经安排好的任务 dp[S].val代表的是目前已经安 ...
- HDU 1074 Doing Homework【状态压缩DP】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意: 给定作业截止时间和完成作业所需时间,比截止时间晚一天扣一分,问如何安排作业的顺序使得最 ...
- hdu 1074 状压dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意:有n个作业,对于每一个作业有一个deadline,有一个完成这作业所需要的时间.如果超过d ...
- kuangbin带你飞专题合集
题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...
- 算法学习经典例题整理
陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...
- [kuangbin]专题12 基础DP
HDU 1024 Max Sum Plus Plus HDU 1029 Ignatius and the Princess IV HDU 1069 Monkey and Banana HDU 1074 ...
- 杭电OJ分类题目(3)
原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(3) HDU Computational Ge ...
- SDU程序设计思维实践题目总结
题目来源及链接 题目名称及讲解博客链接 涉及算法 原题以及原题链接 第二周作业 Maze BFS POJ-3984 Pour water BFS POJ-1606 第二周实验 化学 模拟 codefo ...
- 状态压缩dp学习小记part2
继续学习状态压缩的相关知识. 本来准备继续按照上篇博文里提到的那篇论文继续学习,但被矩形完全覆盖虐了回来,决定先做些其他的题增进理解之后再回来做. Zoj 3471 Most Powerful 题目链 ...
最新文章
- 基于 CoreText 实现的高性能 UITableView
- springboot部署war包为什么tomcat会启动两次
- mybatis 一对一 一对多 级联查询
- .so文件反编译_java加密防止反编译-VirboxProtector
- 【Siddhi】Siddhi的语法关键字
- glassfish linux,Linux下实现GlassFish自动启动
- 如何在C++中集成LUA脚本(LuaWrapper For C++篇)
- org.springframework.web.servlet.view.ContentNegotiatingViewResolver
- 3.3通过EmbeddedServletContainerCustomizer调用Tomcat
- 【深度学习笔记】(一)Octave
- 数学建模算法与应用 数理统计
- matlab画图基本命令
- 使用dea-toolbox进行数据包络分析
- oracle混音插件教程,编辑推荐:7款人声混音插件
- 国产服务器虚拟化产品,国内主流虚拟化厂商之间比较.doc
- C# 字节(数组)与位之间的计算
- dns域名解析原理及过程
- SAP_ABAP_采购价格条件报表
- 「击败星际争霸II职业玩家」的 AlphaStar是在作弊?
- Photoshop制作宠物小精灵球主题图标教程