HDU 1074 (状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074
题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限。超期多少天就要扣多少分。问最少被扣多少分,且按字典序输出做作业顺序。
解题思路:
集合上的DP问题。也就是状态压缩DP。
用二进制位表示做作业的顺序。总bit=1<<15。
对于状态i,枚举当前的作业j,如果i&(1<<(j-1)),则表示当前状态含有作业j。
t^=(1<<(j-1)),还原出还没做j作业之前的状态,现在就有now和pre两个状态了。
计算pre状态下做j作业的扣分情况,+cost[j]-dead[j],没过期得到负数改为0。
dp转移时顺便记录下当前状态的日期,以及状态i做的是哪个作业j。
注意:因为题目要求是输出字典序小的方案,所以应该倒序循环当前作业j。
这里把思路倒一下,记录的是当前的作业,也就是后做的作业,如果正序循环,则表示先做字典序大的作业,后做字典序小的作业。
正好和题目要求相反了。
最后dp[bit-1]就是结果。
递归打印方案,从bit-1开始,每次^个(1<<j),递归终点则还原出一开始做的作业,输出即可。
#include "cstdio"
#include "string"
#include "iostream"
#include "cstring"
using namespace std;
#define maxn 1<<15
int dead[],cost[],dp[maxn],T[maxn],pre[maxn];
string sub[];
void output(int x)
{
if(!x) return;
output(x^(<<pre[x]));
cout<<sub[pre[x]]<<endl;
}
int main()
{
//freopen("in.txt","r",stdin);
ios::sync_with_stdio(false);
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int bit=<<n;
for(int i=;i<n;i++)
cin>>sub[i]>>dead[i]>>cost[i];
for(int i=;i<bit;i++)
{
dp[i]=<<;
for(int j=n-;j>=;j--)
{
int tt=<<j,reduce;
if(!(i&tt)) continue;
tt=i^tt;
reduce=T[tt]+cost[j]-dead[j];
reduce=reduce<?:reduce;
if(dp[tt]+reduce<dp[i])
{
dp[i]=dp[tt]+reduce;
T[i]=T[tt]+cost[j];
pre[i]=j;
}
}
}
printf("%d\n",dp[bit-]);
output(bit-);
memset(pre,,sizeof(pre));
}
}
| 11693089 | 2014-09-21 01:25:25 | Accepted | 1074 | 15MS | 676K | 1166 B | C++ | Physcal |
HDU 1074 (状态压缩DP)的更多相关文章
- hdu 1074(状态压缩dp+记录路径)
题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当存在多种方案时,输出字典序最小的那种,因为题意 ...
- HDU 3341 状态压缩DP+AC自动机
题目大意: 调整基因的顺序,希望使得最后得到的基因包含有最多的匹配串基因,使得所能达到的智商最高 这里很明显要用状态压缩当前AC自动机上点使用了基因的情况所能达到的最优状态 我最开始对于状态的保存是, ...
- hdu 4284 状态压缩dp
题意: 有N 个点的无向图,要去其中 h个地点做事,做事需要先办理护照,之后可以挣一定数量的钱,知道了一开始有的总钱数,和 一些城市之间 道路的花费,问可不可以在 指定的 h 个城 ...
- hdu 2167 状态压缩dp
/* 状态转移方程:dp[i][j]=Max(dp[i][j],dp[i-1][k]+sum[i][j]); */ #include<stdio.h> #include<string ...
- hdu 1074 状态压缩
http://acm.hdu.edu.cn/showproblem.php?pid=1074 我们可以断定状态的终止态一定是n个数全部选完的情况,那么它的前一个状态是什么呢,一定是剔除任一门课程后的n ...
- HDU 4856 (状态压缩DP+TSP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4856 题目大意:有一个迷宫.迷宫里有些隧道,每个隧道有起点和终点,在隧道里不耗时.出隧道就耗时,你的 ...
- HDU 4640 状态压缩DP 未写完
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...
- 2016"百度之星" - 初赛(Astar Round2A)1002 / HDU 5691 状态压缩DP
Sitting in Line Problem Description 度度熊是他同时代中最伟大的数学家,一切数字都要听命于他.现在,又到了度度熊和他的数字仆人们玩排排坐游戏的时候了.游戏的规则十 ...
- HDU 5067 (状态压缩DP+TSP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5067 题目大意:蓝翔挖掘机挖石子.把地图上所有石子都运回起点,问最少耗时. 解题思路: 首先得YY出 ...
随机推荐
- Linux中启动和停止jar包的运行
脚本一: startTest.sh内容如下: #!/bin/sh java -jar Test.jar & #注意:必须有&让其后台执行,否则没有pid生成 echo $! ...
- js 中数组或者对象的深拷贝和浅拷贝
浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变! 深拷贝:就是重新复制一块内存,这样就不会互相影响. 有些时候我们定义 ...
- Linux 查看网络连接状态
CLOSED:无连接是活动的或正在进行ESTABLISED:已建立连线的状态:SYN_SENT:发出主动连线 (SYN 标志) 的连线封包:SYN_RECV:接收到一个要求连线的主动连线封包:FIN_ ...
- JSoup——用Java解析html网页内容
当需要从网页上获取信息时,需要解析html页面.筛选指定标签,并获取其值是必不可少的操作,解析html页面这方面的利器,Python有BeautifulSoup,Java一直没有好的工具,之前的Htm ...
- http://www.highcharts.com/
MAKE YOUR DATA COME ALIVE HIGHCHARTS CLOUD Online charts for non-techies. Create smashing, interacti ...
- CI邮箱中SMTP的一些端口
介绍其他几个常用邮箱设置,并以网易126邮箱为例,发图. 一.新浪邮箱(1)新浪邮箱自08年6月分服务器被攻击后开始对pop取件频率进行了严格**,同时新注册的用户需要手动才能开通pop ...
- iOS 用protocol 和 用继承小体会
最近写程序时,2个类都有相同的函数,又因为在用oc,所以就用了protocol来实现.后来发现其实这2个类除了相同的函数,还需要一些相同的变量,当初用继承的话会更简单.
- PHP负数判空
2014年11月6日 10:08:09 $a = -1; $b = '-1'; $c = empty($a); $d = empty($b); var_dump($c, $d); // bool(fa ...
- 【贪心】最大乘积-贪心-高精度-java
问题 G: [贪心]最大乘积 时间限制: 1 Sec 内存限制: 128 MB提交: 34 解决: 10[提交][状态][讨论版] 题目描述 一个正整数一般可以分为几个互不相同的自然数的和,如3 ...
- Heap:Sunscreen(POJ 3614)
晒太阳 题目大意:一堆牛,为了避免晒太阳会灼烧自己,然后他们自己有自己的防晒指数(一个区间),防晒霜可以提高防晒因数SPF,大了不行小了不行,现在有一桶防晒霜,他们提供一定的SPF,但是最多可以提供k ...