D - Doing Homework HDU - 1074 (状压dp)
题目链接:https://cn.vjudge.net/contest/68966#problem/D
具体思路:我们可以把每个情况都枚举出来,然后用递归的形式求出最终的情况.
比如说 我们要求 10101 的扣分最小值,我们可以把 10100和00101和10001这三种 情况加上 对应的课的时候的最小值,具体解释看代码
(再理解一下,对于这个公式tmp[i]=tmp[i^(1<<j)]+max(sum-d[j],0)
我们之前求的是总的花费的时间,然后如果一门课的截止时间小于这个总的时间花费,也就是说这是要被扣分的没我们是要懂这些被扣分的情况中选取一个扣分最小的情况选出来.(等于的时候也需要考虑,因为有可能相等的时候有的路的花费是不同的)
AC代码:
#include<bits/stdc++.h>
using namespace std;
# define ll long long
const int maxn = 50000+100;
# define inf 0x3f3f3f3f
const int mod = 1e9;
struct node
{
string str;
int st;
int con;
} q[maxn];
int dp[maxn],pre1[maxn],pre2[maxn];
vector<int>vis;
int main()
{
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
vis.clear();
memset(dp,inf,sizeof(dp));
memset(pre1,0,sizeof(pre1));
memset(pre2,0,sizeof(pre2));
int n;
cin>>n;
dp[0]=0;
for(int i=0; i<n; i++)
{
cin>>q[i].str>>q[i].st>>q[i].con;
}
int maxstate=(1<<n)-1;
for(int i=1; i<=maxstate; i++)
{
int sum=0;
int tmp;
for(int j=0; j<n; j++)
{
if((1<<j)&i)sum+=q[j].con;;//所需要的时间
}
for(int j=0; j<n; j++)
{
if((1<<j)&i)
{
tmp=dp[i^(1<<j)]+max(sum-q[j].st,0);//这个公式的具体含义,我们要求的是加上最后一门课的最优情况,所以我们可以把所有的时间都加上,然后在计算一下新加入的这门课的截止时间,最后求一下差就可以了
if(tmp<=dp[i])
{
dp[i]=tmp;
pre1[i]=j;
pre2[i]=((1<<j)^i);
}
}
}
}
cout<<dp[maxstate]<<endl;
for(int i=maxstate; i>=1; i=pre2[i])
{
// cout<<q[pre1[i]].str<<endl;
vis.push_back(pre1[i]);
}
int len=vis.size();
for(int i=len-1; i>=0; i--)
{
cout<<q[vis[i]].str<<endl;
}
}
return 0;
}
D - Doing Homework HDU - 1074 (状压dp)的更多相关文章
- Doing Homework HDU - 1074 (状压dp)
Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every ...
- Doing Homework(HDU 1074状压dp)
题意:给你n个要做的作业,它们的名字.期限.可完成所需天数(必须连续)在规定期限不能完成要扣分(每天一分)求做作业顺序使扣分最少. 分析:作业数量较少,用状态压缩,做到第i种作业花费的天数dp[i]. ...
- HDU 1074状压DP
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- hdu 1074 (状压dp)
题意: 给出几个学科的作业.每个作业剩余的时间.完成每个学科作业的时间.如果在剩余时间内不能完成相应作业 就要扣分 延迟一天扣一分 求最小扣分 解析: 把这些作业进行全排列 求出最小扣分即可 但A( ...
- HDU 4778 状压DP
一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...
- HDU 3001 状压DP
有道状压题用了搜索被队友骂还能不能好好训练了,, hdu 3001 经典的状压dp 大概题意..有n个城市 m个道路 成了一个有向图.n<=10: 然后这个人想去旅行.有个超人开始可以把他扔到 ...
- hdu 2809(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809 思路:简单的状压dp,看代码会更明白. #include<iostream> #in ...
- hdu 2167(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2167 思路:经典的状压dp题,前后,上下,对角8个位置不能取,状态压缩枚举即可所有情况,递推关系是为d ...
- Engineer Assignment HDU - 6006 状压dp
http://acm.split.hdu.edu.cn/showproblem.php?pid=6006 比赛的时候写了一个暴力,存暴力,过了,还46ms 那个暴力的思路是,预处理can[i][j]表 ...
随机推荐
- UVAlive3523_Knights of the Round Table
圆桌骑士.有的骑士之间是相互憎恨的,不能连坐,需要安排奇数个骑士围着桌子坐着,大于3个,求哪些骑士不可能安排到座位. 根据给定的关系,如果两个骑士之间没有憎恨关系,那么连边.最终就是求有多少个点无法位 ...
- Machine Learning CodeForces - 940F(带修改的莫队)
题解原文地址:https://www.cnblogs.com/lujiaju6555/p/8468709.html 给数组a,有两种操作,1 l r查询[l,r]中每个数出现次数的mex,注意是出现次 ...
- maven 手动执行下载
先把命令行切换到Maven项目的根目录,比如:/d/xxxwork/java/maven-test,然后执行命令: mvn clean compile
- 百度地图经纬度批量查找功能XGeocoding使用手册
<XGeocoding使用手册> 1.下载XGeocoding V2 http://www.gpsspg.com/xgeocoding/download/ 2.解压XGeocoding_v ...
- 【hdu2809】 不要62
http://acm.hdu.edu.cn/showproblem.php?pid=2089 (题目链接) 题意 求区间${[n,m]}$中不含有62和4的数的个数. Solution 数位dp板子. ...
- MongoDB ShardingCluster
sharding集群中的组件: 1.mongos:router,可以通过keepalived实现高可用. 2.config server:元数据服务器,这里要借助zookeeper存放配置信息. 3. ...
- 左值与右值,左值引用与右值引用(C++11)
右值引用是解决语义支持提出的 这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运 ...
- getopt_long
http://blog.csdn.net/lanyan822/article/details/7692013 在程序中难免需要使用命令行选项,可以选择自己解析命令行选项,但是有现成的,何必再造轮子.下 ...
- Visual Studio 2013打开项目出现“未安装项目的目标框架”提示
问题描述: windows 10 系统里用Visual Studio 2013打开项目,提示如下: 说项目的.NET Framework version=v4.5,系统里没装,让将项目的框架从v4.5 ...
- Service Fabric Cluster Manager
作者:潘罡 (Van Pan)@ Microsoft 我们回到Service Fabric最底层的话题,谈谈Service Fabric是怎么工作的. 首先,我们回到下面的文档,看看Service F ...