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 ...
随机推荐
- 为system对象添加扩展方法
////扩展方法类:必须为非嵌套,非泛型的静态类 public static class DatetimeEx { //通过this声明扩展的类,这里给DateTime类扩展一个Show方法,只有一个 ...
- ros下单目相机校正
1. 安装对应的驱动与程序包. 图像对应包 http://wiki.ros.org/camera_calibration 在gitbub下载image_pipeline : ...
- Linux安装过程记录信息
全新的linux安装完成后,会在root目录下有一下三个文件,记录了Linux的安装细节 anaconda-ks.cfg 以Kickstart配置文件的格式记录安装过程中设置的选项信息 install ...
- 4.对urls.py的解释
解释: 路由配置文件(URL分发器),它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表.就是以这种方式告诉Django对于每个URL的处理类.Django启动的时候回去加载urls. ...
- CI 框架下执行CLI(命令行)
1.可以按照Ci官方文件的指导来进行操作 让我们先创建一个简单的控制器,打开你的文本编辑器,新建一个文件并命名为 Tools.php,然后输入如下的代码: <?php class Tools e ...
- 小程序坑 redirectTo 计时器 setInterval clearInterval
var time = 20: var timer = setInterval(function () { time = time - 1; that.setData({ CountDown: time ...
- 每天一个Linux命令(34)grep命令
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...
- Data Structure Stack: Infix to Postfix
http://geeksquiz.com/stack-set-2-infix-to-postfix/ #include <iostream> #include <vector> ...
- HTML入门学习笔记
1.html文件的基本架构 <HTML> <HEAD> <TITLE> 网页的标题 </TITLE> </HEAD> <BODY> ...
- Hadoop切换namenode为active
hadoop切换namenode为active 进入hadoop/bin目录下 ./yarn rmadmin -transitionToActive --forcemanual rm1 重新启动zkf ...