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 状态压缩的更多相关文章

  1. HDU 1074 (状态压缩DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...

  2. hdu 1074(状态压缩dp+记录路径)

    题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当存在多种方案时,输出字典序最小的那种,因为题意 ...

  3. Doing Homework HDU - 1074 状态压缩

    #include<iostream> #include<cstring> #include<cstdio> #include<string> #incl ...

  4. hdu 4739(状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4739 思路:状态压缩. #include<iostream> #include<cs ...

  5. HDU 3341 状态压缩DP+AC自动机

    题目大意: 调整基因的顺序,希望使得最后得到的基因包含有最多的匹配串基因,使得所能达到的智商最高 这里很明显要用状态压缩当前AC自动机上点使用了基因的情况所能达到的最优状态 我最开始对于状态的保存是, ...

  6. hdu 2167(状态压缩基础题)

    题意:给你一个矩阵,让你在矩阵中找一些元素使它们加起来和最大,但是当你使用某一个元素时,那么这个元素周围的其它八个元素都不能取! 分析:这是一道比较基础的状态压缩题,也是我做的第三道状态压缩的题,但是 ...

  7. hdu 1565(状态压缩基础题)

    题意:容易理解. 分析:这是我做的状态压缩第二题,一开始超内存了,因为数组开大了,后来超时了,因为能够成立的状态就那么多,所以你应该先把它抽出来!!总的来说还是比较简单的!! 代码实现: #inclu ...

  8. HDU 2553 状态压缩

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. hdu 3006(状态压缩)

    The Number of set Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

随机推荐

  1. IOS - 执行时 (多态)

    一 多态概述          多态指同一操作作用于不同的对象.能够有不同的解释.产生不同的执行结果.它是面向对象程序设计(OOP)的一个重要特征,动态类型能使程序直到执行时才确定对象的所属类.其详细 ...

  2. ALV行 列颜色设置

    ALV的颜色设置分为3种:行.列.单元格.   1.列颜色的设置   在 slis_t_fieldcat_alv-emphasize 中,写入需要的颜色代码.   Eg:   DATA: fc TYP ...

  3. mysql中子查询更新,得用别名表

    通过查出最大id,来更新记录 update order set status = 'xx' where id in (select v.id from (select max(id) id from ...

  4. ubuntu14.04 安装pip vitualenv flask

    安装pip: $ apt-get install python-pip$ pip -V #查看版本 确认安装成功 安装完pip后,会发现下载的速度特别慢.按如下修改: $ vim ~/.pip/pip ...

  5. 【九】MongoDB管理之安全性

    要保证一个安全的MongoDB运行环境,DBA需要实施一些控制保证用户或应用程序仅仅访问它们需要的数据.这些措施包括但不限于: 认证机制 基于角色的访问控制 加密 审计 一.认证机制 认证是验证客户端 ...

  6. JS饼状图表数据分布插件

    在线演示 本地下载

  7. poj 3006 Dirichlet's Theorem on Arithmetic Progressions【素数问题】

    题目地址:http://poj.org/problem?id=3006 刷了好多水题,来找回状态...... Dirichlet's Theorem on Arithmetic Progression ...

  8. castle windsor学习-----How components are created

  9. 算法(Algorithms)第4版 练习 1.5.15

    用归纳法推导: 1.height = 0时,成立,其level 0的节点个数为C(0,0)=1. height = 1时,成立,其level 0的节点个数为C(1,0)=1,其level 1的节点个数 ...

  10. Sobel边缘检测

    Sobel算子:[-1  0  1 -2  0  2 -1  0  1] 用此算子与原图像做卷积,可以检测出垂直方向的边缘.算子作用在图像的第二列,结果是:200,200,200:作用在第三列,结果是 ...