hdu1074 状态压缩dp+记录方案
题意:
给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案。
思路:
状态压缩dp,记录方案数的地方我用的是类似并查集的方法,记录当前状态是那个状态转移过来的,<输出的时候可以 异或 出来>,对于字典序最小,这个比较好处理,给的是升序的,所以直接更新的时候记录就行了,<如果没给可以sort下>,我是开了一个dp[i]表示i状态时的最小扣分,然后在开一个数组time[i],记录dp[i]是对应的当前时间,然后每一个状态都用n个作业更新下,的到最优就行了,下面给出关键代码和ac代码
for(j = 0 ;j <= (1 << n) - 1 ;j ++)
for(i = 1 ;i <= n ;i ++)
{
int tt = time[j] + node[i].cost - node[i].end;
if(tt < 0) tt = 0;
if(dp[j|(1<<(i-1)))] > dp[j] + tt)
{
mer[j|(1<<(i-1))] = j;//记录路径
dp[j|(1<<(i-1))] = dp[j] + tt;
time[j|(1<<(i-1))] = time[j] + node[i].cost;
}
}
答案等于 dp[(1<<1)-1]
然后是输出路径
int x = (1 << n) - 1;
int id = 0;
while(x != mer[x])
{
Ans[++id] = x ^ mer[x];
x = mer[x];
}
for(i = n ;i >= 1 ;i --)
printf("%s\n" ,node[log2(Ans[i])+1].str);
#include<stdio.h> #include<string.h> #include<math.h> typedef struct {int end ,cost;char str[110]; }NODE;NODE node[20]; int dp[1<<16]; int Time[1<<16]; int mer[1<<16]; int Ans[20];int minn(int x ,int y) {return x < y ? x : y; }int maxx(int x ,int y) {return x > y ? x : y; } int main () {int t ,n ,i ,j;scanf("%d" ,&t);while(t--){scanf("%d" ,&n);for(i = 1 ;i <= n ;i ++)scanf("%s %d %d" ,node[i].str ,&node[i].end ,&node[i].cost);for(i = 0 ;i <= 1 << n ;i ++)dp[i] = 1000000000 ,Time[i] = 0 ,mer[i] = i;dp[0] = 0;for(j = 0 ;j <= (1 << n)-1 ;j ++)for(i = 1 ;i <= n ;i ++){ int tt = Time[j] + node[i].cost - node[i].end;if(tt < 0) tt = 0; if(dp[j|(1<<(i-1))] > dp[j] + tt){mer[j|(1<<(i-1))] = j;dp[j|(1<<(i-1))] = dp[j] + tt;Time[j|(1<<(i-1))] = Time[j] + node[i].cost;} }printf("%d\n" ,dp[(1<<n)-1]);int x = (1<<n) - 1;int id = 0;while(x != mer[x]){Ans[++id] = x ^ mer[x];x = mer[x];}for(i = n ;i >= 1 ;i --)printf("%s\n" ,node[int(log2(Ans[i]))+1].str); }return 0; }
hdu1074 状态压缩dp+记录方案相关推荐
- 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)
目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
- 状态压缩DP AcWing算法提高课 (详解)
基础课的状态压缩点这里 基础课中 蒙德里安的梦想 属于 棋盘式状态压缩dp,最短Hamilton路径 属于 集合状态压缩dp 1064. 小国王(棋盘式/基于连通性) 这种棋盘放置类问题,在没有事先知 ...
- jzoj1768,P2704,POJ1185-[NOI2001]炮兵阵地【状态压缩dp】
正题 POJ链接:http://poj.org/problem?id=1185 jzoj链接:https://jzoj.net/senior/#main/show/1768 洛谷评测记录:https: ...
- 327 玉米田(状态压缩dp)
1. 问题描述: 农夫约翰的土地由 M×N 个小方格组成,现在他要在土地里种植玉米.非常遗憾,部分土地是不育的,无法种植.而且,相邻的土地不能同时种植玉米,也就是说种植玉米的所有方格之间都不会有公共边 ...
- 第一章 动态规划 状态压缩DP
1.基本概述 状态压缩dp和状态机一样,都是一种特殊的状态表示方式.状态机用一系列小状态表示某一状态.状态压缩dp用二进制数进行表示.虽然看代码起来时间复杂度比较高,但是很多的情况都给剪枝掉了. 状态 ...
- 动态规划-状态压缩DP
[SCOI2005] 互不侵犯 题目描述 https://www.luogu.com.cn/problem/P1896 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它 ...
- 【AcWing】数位统计DP、树形DP、状态压缩DP、记忆化搜索
[AcWing]数位统计DP.树形DP.状态压缩DP.记忆化搜索 一.数位统计DP 二.状态压缩DP 三.树形DP 四.记忆化搜索 一.数位统计DP 计数问题 给定两个整数 a 和 b,求 a 和 b ...
- 动态规划(5)状态压缩dp
一.概述 动态规划的过程是随着阶段不断增长,在每个状态维度上不断扩展.在任意时刻,已经求出最优解的状态与尚未求出最优解的状态在各维度上的分界点组成了dp扩展的轮廓,对于某些问题,我们需要在动态规划的状 ...
最新文章
- DeepMind-深度学习: AI革命及其前沿进展 (54页ppt报告)
- 测试半桥电路 TPS28225,NCP3420驱动MOS半桥
- python tkinter详解 博客园_python tkinter-布局
- curl 怎么在xp下使用_Http Post 快速使用
- lucene Collector 文档收集器
- PHP header发送各种类型文件及设置文件下载名
- Spring Boot整合MyBatis连接Oracle数据库
- rcnn代码实现_Faster-RCNN论文细节原理解读+代码实现gluoncv(MXNet)
- 最短路计数(松弛操作处理)
- SDOD: Real-time Segmenting and Detecting 3D Objects by Depth(实时3D检测与分割)
- 190430每日一句
- 倒计时器c语言,在线倒计时器
- 如何修复Win10下的 flashplayer?
- ThreadX内核源码分析 - 事件
- yarn : 无法加载文件 C:\Users\L\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本
- 经营计划与经营利润分析动态报表的实现--业务需求
- Android/IOS/Web跳转第三方QQ指定QQ号的聊天框,实现陌生人聊天
- PowerBI报表页权限控制
- 80后的北漂IT人:你的未来在哪?该做好打算了!
- 集束管的一些基础知识