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 ...
随机推荐
- [IOI2018]组合动作
IOI2018 组合动作 UOJ 首先显然可以两次试出首字母 考虑增量构造 假设首字母为A,且已经试出前i个字母得到的串s 我们考虑press这样一个串s+BB+s+BX+s+BY+s+XA 首先这个 ...
- 只需两步删除 node_modules
peng@PENG-PC /E/_My_File_____/home/learn/web_qianduan/mithril-demo/demo2/mithril -demo $ npm install ...
- Call method 的使用
SAP学习日志---Call method 的使用 以及常见错误 转载▼ 可以通过以下方法 call method 1. 进入全局类中 找到方法,拖到程序中 2. 使用pattern 中的 AAB ...
- 关于matlab曲线拟合的问题
matlab 曲线拟合工具箱,app->curve fitting 可以使用generate直接产生代码,生成的是函数 该函数直接返回的结果为cfit格式,直接读取不了,网上有网友说可以采用y ...
- MySQL常用代码
create database 数据库名 create table CeShi1( Uid varchar(50) primary key, Pwd varchar(50), Name varchar ...
- PAT 天梯赛 L2-014. 列车调度 【队列】
题目链接 https://www.patest.cn/contests/gplt/L2-014 思路 其实 每条火车道 都可以视为一个队列 满足队列的性质 当已经存在的队列 中 的列车序号 都小于 当 ...
- Spring Cloud之Swagger集群搭建
在微服务中,Swagger是每个服务 比如会员服务,订单服务,支付服务 进行继承. 如何将整个微服务中的Swagger进行合成,同一台服务器上. 使用Zuul+Swagger实现管理整个微服务API文 ...
- retry.RetryInvocationHandler (RetryInvocationHandler.java:invoke(140)) - Exception while invoking getFileInfo of class ClientNamenodeProtocolTranslatorPB over bdata236/192.168.1.236:9000 after 3 fail
报错信息如下 -- ::, INFO [main]: retry.RetryInvocationHandler (RetryInvocationHandler.java:invoke()) - Exc ...
- CSS: iPhone Custom CSS
1. [代码][CSS]代码 <style type="text/css" media="screen"> /* iPhone 4@media on ...
- npm-install once
Once 是我最习惯的模块,它展示了几乎所有的我书写的通过issac Schlueter创建的应用. 原理很简单,Once使用各类一个函数且返回了一个函数,你可以调用这个函数,但是只能调用一次.如果你 ...