hdu 1074 状态压缩
http://acm.hdu.edu.cn/showproblem.php?pid=1074
我们可以断定状态的终止态一定是n个数全部选完的情况,那么它的前一个状态是什么呢,一定是剔除任一门课程后的n种状态。
例如
dp[全选了]=min{(dp[除了math都做了]+math的超时天数),(dp[除了computer都做了]+computer的超时天数),(dp[除了english都做了]+english的超时天数)}那么接下来的dp状态依然如此。
好了,接下来,我们该如何去思考了,这个题目共有2^15种可能情况,对此我们通过位运算的方法降低它的维度。
二进制的每一位代表一门课,它的组合可以完成展示出所有的状态。
最后我们应该去思考一个问题,顺序的问题,我们知道,第一次取得时候,一定只有一个课程,如果我们以
int bit = <<n;
for(int i = ;i<bit;i++)
能否确保某一个状态的前一个都完全包含,你可以自己去检验,是完全满足的.
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = (<<)+;
const int INF = 0x3f3f3f;
struct node
{
char str[];
int d;//the deadtime
int c;//need spend time
};
node nd[];
int dp[MAXN],pre[MAXN],t[MAXN];
void output(int x)
{
if(!x)
return ;
output(x-(<<(pre[x]-)));
printf("%s\n",nd[pre[x]].str);
}
int main()
{
int cas,n;
scanf("%d",&cas);
while(cas--)
{
memset(t,,sizeof(t));
memset(pre,,sizeof(pre));
//memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i = ;i<=n;i++)
{
scanf("%s%d%d",nd[i].str,&nd[i].d,&nd[i].c);
}
/* for(int i = 1;i<=n;i++)
{
printf("%s %d %d\n",nd[i].str,nd[i].d,nd[i].c);
}*/
int bit = <<n;
for(int i = ;i<bit;i++)
{
dp[i] = INF;
for(int j = n;j>=;j--)
{
int temp = <<(j-);
if(!(temp&i))
continue;
else
{
int dist = (t[i-temp]+nd[j].c-nd[j].d);
if(dist > )
{
if(dp[i]>(dp[i-temp]+dist))
{
t[i]=t[i-temp]+nd[j].c;
dp[i]=dp[i-temp]+dist;
pre[i] = j;
}
}
else
{
if(dp[i]>dp[i-temp])
{
t[i]=t[i-temp]+nd[j].c;
dp[i]=dp[i-temp];
pre[i] =j;
}
}
}
}
}
cout<<dp[bit-]<<endl;
output(bit-);
}
return ;
}
hdu 1074 状态压缩的更多相关文章
- HDU 1074 (状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...
- hdu 1074(状态压缩dp+记录路径)
题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当存在多种方案时,输出字典序最小的那种,因为题意 ...
- Doing Homework HDU - 1074 状态压缩
#include<iostream> #include<cstring> #include<cstdio> #include<string> #incl ...
- hdu 4739(状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4739 思路:状态压缩. #include<iostream> #include<cs ...
- HDU 3341 状态压缩DP+AC自动机
题目大意: 调整基因的顺序,希望使得最后得到的基因包含有最多的匹配串基因,使得所能达到的智商最高 这里很明显要用状态压缩当前AC自动机上点使用了基因的情况所能达到的最优状态 我最开始对于状态的保存是, ...
- hdu 2167(状态压缩基础题)
题意:给你一个矩阵,让你在矩阵中找一些元素使它们加起来和最大,但是当你使用某一个元素时,那么这个元素周围的其它八个元素都不能取! 分析:这是一道比较基础的状态压缩题,也是我做的第三道状态压缩的题,但是 ...
- hdu 1565(状态压缩基础题)
题意:容易理解. 分析:这是我做的状态压缩第二题,一开始超内存了,因为数组开大了,后来超时了,因为能够成立的状态就那么多,所以你应该先把它抽出来!!总的来说还是比较简单的!! 代码实现: #inclu ...
- HDU 2553 状态压缩
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 3006(状态压缩)
The Number of set Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- Bootstrap 第一天
Bootstrap第一天 1.什么是Bootstrap? Bootstrap是由两位设计开发的. Bootstrap主要是前端的框架(HTML.CSS.JS). 2.为什么使用Boot ...
- 蓝屏代码stop:0X000000EA(0X85E286B8,0X8635F210,0XF7A53CBC,0X00000001)
你这是显卡驱动问题,我把蓝屏代码都给你,以后在出现蓝屏自己看看行了. 1.0x0000000A:IRQL_NOT_LESS_OR_EQUAL ◆错误分析:主要是由问题的驱动程序.有缺陷或不兼容的硬件与 ...
- Kindeditor 编辑区样式结构
ke-container ke-toolbar ke-edit ke-edit-iframe ke-edit-area ke-statusbar
- iOS uitableViewCell 选中 push后返回 取消选中状态
首先我有一个UITableViewController,其中每个UITableViewCell点击后都会push另一个 ViewController,每次点击Cell的时候,Cell都会被选中,当从p ...
- 20145229吴姗珊两天小总结 《Java程序设计》第4周学习总结
20145229吴姗珊两天小总结 <Java程序设计>第4周学习总结 教材学习内容总结 由于自己的基础不好对知识的理解不透彻,所以这两天的学习还是集中在第六章和第七章,对知识点多了一点理解 ...
- centos web+mysql服务器的安全
今天闲来无事,拿来X-Scan-v3.3 来扫描自己的服务器,开放端口有22,80,443,3306:3306端口被扫出来,呵呵,那可不得了: 一,屏蔽扫描器扫出3306端口,因为web和数据库是在同 ...
- JsonSchema使用详解
JSON Schema是一个用于验证JSON数据结构的强大工具, 我查看并学习了JSON Schema的官方文档, 做了详细的记录, 分享一下. 我们可以使用JSON Schema在后续做接口测试中做 ...
- java:Map借口及其子类HashMap二
java:Map借口及其子类HashMap二 重点:所有的集合必须依赖Iterator输出 Map<String, Integer> map = new HashMap<String ...
- 浅谈WebService开发(一)
一.什么是WebService: 简单通俗来说,就是企业之间.网站之间通过Internet来访问并使用在线服务,一些数据,由于安全性问题,不能提供数据库给其他单位使用,这时候可以使 用WebSer ...
- invalid constant type: 18
javassist 3.18以下的版本不支持在JDK1.8下运行