hdu 1074 Doing Homework

2023-10-30

Problem

acm.hdu.edu.cn/showproblem.php?pid=1074

题意

n 份作业,分别给出名字、完成所需时间 cost、最迟上交时间 deadline。

作业每迟交一天扣一分。问最少的扣分数。

Analysis

状态压缩DP。

用集合 S 记录已经做完的作业。

dp[S]:已经做了 S 要扣的最少的分数

状态转移:dp[S] = min { dp[ S | 1 << i ] + score | i NOT IN S }

其中:score = max { 0 , time[S] + homework[i].cost - homework[i].deadline },即做完 S 后做 i 要多扣的分数;

time[S] = Zigma { homework[i].cost | i IN S },即做 S 所用的时间和。

因为要打印做作业的顺序,且是在最优情况下字典序最小的方案,所以用辅助的数组记录顺序。

记忆化搜索的过程是由大集合的答案推小集合,记录的是后继,即:nxt[S]:做完 S 后做哪个作业;

而递推版是由小集合推大集合,记录的是前驱,即:pre[S]:S 中最后做的作业。最后 借助栈逆序输出。

记忆化搜索找下一个作业的循环是从 0 到 n-1,而递推写法则要从 n-1 到 0(见代码注释)。这个跟那个字典序最小方案的要求有关。我觉得:因为数据输入是按字典序,搜索版是从大集合推小集合,从前往后遍历可以让字典序大的覆盖小的,出现在更大的集合里,所以就更晚出现;递推版就刚好相反。(这个理解不知道对不对)

Source code

记忆化搜索版

#include <cstring>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int N = 15, BIG = 123456789;

struct
{
	string nm;
	int c, d;
} hw[N];
int dp[1<<N], nxt[1<<N], n;

int dfs(int s, int t)
{
	if(s == (1 << n) - 1)
		return dp[s] = 0;
	if(dp[s] >= 0)
		return dp[s];
	dp[s] = BIG;
	for(int i=0, score; i<n; ++i) // 遍历顺序从小到大
		if(s >> i & 1 ^ 1)
		{
			score = max(0, t + hw[i].c - hw[i].d);
			score += dfs(s|1<<i, t+hw[i].c);
			if(score < dp[s])
			{
				nxt[s] = i;
				dp[s] = score;
			}
		}
	return dp[s];
}

int main()
{
	ios::sync_with_stdio(false);
	int t;
	cin >> t;
	while(t--)
	{
		cin >> n;
		for(int i=0; i<n; ++i)
			cin >> hw[i].nm >> hw[i].d >> hw[i].c;
		memset(dp, -1, sizeof dp);
		memset(nxt, -1, sizeof nxt);
		cout << dfs(0, 0) << '\n';
		for(int i=0; ~nxt[i]; i|=1<<nxt[i])
			cout << hw[nxt[i]].nm << '\n';
	}
	return 0;
}

递推版

#include <cstring>
#include <iostream>
#include <string>
#include <stack>
#include <algorithm>
using namespace std;
const int N = 15;

struct
{
	string nm;
	int c, d;
} hw[N];
int dp[1<<N], pre[1<<N], tm[1<<N];
stack<string> ans;

int main()
{
	ios::sync_with_stdio(false);
	int t;
	cin >> t;
	while(t--)
	{
		int n;
		cin >> n;
		for(int i=0; i<n; ++i)
			cin >> hw[i].nm >> hw[i].d >> hw[i].c;
		memset(pre, -1, sizeof pre);
		memset(dp, 5, sizeof dp);
		dp[0] = tm[0] = 0;
		for(int s=1, e=(1<<n); s<e; ++s)
			for(int i=n-1, score; ~i; --i) // 遍历顺序从大到小
				if(s >> i & 1)
				{
					score = dp[s^1<<i] + max(0, tm[s^1<<i]+hw[i].c-hw[i].d);
					if(score < dp[s])
					{
						dp[s] = score;
						pre[s] = i;
						tm[s] = tm[s^1<<i] + hw[i].c;
					}
				}
		cout << dp[(1<<n)-1] << '\n';
		for(int i=(1<<n)-1; ~pre[i]; i^=1<<pre[i])
			ans.push(hw[pre[i]].nm);
		for( ; !ans.empty(); ans.pop())
			cout << ans.top() << '\n';
	}
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hdu 1074 Doing Homework 的相关文章

  • 【CSDN竞赛第17期】简要题解 92.5分

    目录 1 判断胜负 简单字符串 题目 题解 比赛时代码 2 买铅笔 简单算数 题目 题解 代码 3 拯救爱情 得分70 题目 题解 比赛时代码 4 拯救公主 中国剩余定理 或 模拟 题目 题解 模拟 中国剩余定理 比赛时代码 1 判断胜负
  • 杭电OJ_(2043)密码

    Problem Description 网上流传一句话 常在网上飘啊 哪能不挨刀啊 其实要想能安安心心地上网其实也不难 学点安全知识就可以 首先 我们就要设置一个安全的密码 那什么样的密码才叫安全的呢 一般来说一个比较安全的密码至少应该满足
  • 蓝桥杯 砝码称重 递归 解题报告

    5个砝码 用天平称重时 我们希望用尽可能少的砝码组合称出尽可能多的重量 如果只有5个砝码 重量分别是1 3 9 27 81 则它们可以组合称出1到121之间任意整数重量 砝码允许放在左右两个盘中 本题目要求编程实现 对用户给定的重量 给出砝
  • c编程:求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

    求出4 4矩阵中最大和最小元素值及其所在行下标和列下标 求出两条主对角线元素之和 include
  • hdu 2586 How far away ?

    Problem acm hdu edu cn showproblem php pid 2586 Meaning 给一棵 n 个点的树 和 n 1 条边的边权 多次询问树上两点的距离 Analysis 以任意顶点为根 DFS 预处理出所有结点
  • hdu 1255 覆盖的面积

    Problem acm hdu edu cn showproblem php pid 1255 Reference hdu 1255 覆盖的面积 矩形面积并 矩形面积交 矩形周长并 线段树 扫描线总结 Meaning 给出 n 个矩形 求它
  • hdu 5792 World is Exploding 2016 Multi-University 5

    Problem acm hdu edu cn showproblem php pid 5792 题意 给一个序列 V 问有多少个由下标组成的四元组 a b c d 满足 a b c d a lt b c lt d Va lt Vb Vc g
  • hdu 2043 密码

    密码 Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 22640 Accepted Submissi
  • 数的划分(递归)

    整数划分是另外的问题 题目描述 Description 将整数n分成k份 且每份不能为空 任意两种划分方案不能相同 不考虑顺序 例如 n 7 k 3 下面三种划分方案被认为是相同的 7 1 1 5 7 1 5 1 7 5 1 1 问有多少种
  • 动态规划问题——最长上升子序列(LIS)(一)

    原文转载自我的博客benym cn 推荐链接 动态规划问题 最长上升子序列 LIS 二 动态规划问题 最长上升子序列 LIS 三 如 求 2 7 1 5 6 4 3 8 9 的最长上升子序列 我们定义d i i 1 n 来表示前i个数以A
  • hdu 1080 Human Gene Functions

    Problem acm hdu edu cn showproblem php pid 1080 Meaning 给出一个二维表 similarity 表示对应核苷酸配对时的相似度值 横杠 表示用空格代替一个核苷酸 给出两个DNA序列 a 和
  • 递归、加法原理,如何分解问题(独立且完备的划分)

    加法原理适用于做一件事有n种独立不相交且完备的方向 每个方向上有ai种方案 则总的方案数就是 a1 a2 an 例题 把n个数分为k个非空子集 有多少种分法 分解问题 第一个集合里放多少个数把原问题的解分成了独立且完备的若干方向 分别解每个
  • Palindrome subsequence【区间DP+冗斥】

    题目链接HDU 4632 题目让我们求给定的一段字符串上回文串的长度 一个数也算是回文串 于是我就想怎样去找其中的规律 我举了些例子 先是从相同的字符串开始举例 aaa 对于aaa dp 1 1 1 dp 2 2 1 dp 1 2 dp 1
  • hdu 3966 Aragorn's Story

    Problem acm hdu edu cn showproblem php pid 3966 Reference 树链剖分 树链剖分原理 树链剖分详解及模板 HDU3966 树链剖分 Meaning 一棵 n 个点的树 每给结点有个值 三
  • GYM-102920-L. Two Buildings(决策单调性+分治)

    题目链接 题目大意 求一段序列的 h i h j j i 的最大值 step1 转化一下题意 h i h j j i h j h i j i 令a i h i b i h i 然后全部转化为两种坐标 i a i i b i 这样题目就转化成
  • UVa 12504 Updating a Dictionary

    Problem uva onlinejudge org index php option com onlinejudge Itemid 8 page show problem problem 3948 题意 貌似是模拟 Source Cod
  • Ugly Numbers

    题目描述 Ugly numbers are numbers whose only prime factors are 2 3 or 5 The sequence 1 2 3 4 5 6 8 9 10 12 shows the first 1
  • 蓝桥杯 填字母游戏(博弈论)

    小明经常玩 LOL 游戏上瘾 一次他想挑战K大师 不料K大师说 我们先来玩个空格填字母的游戏 要是你不能赢我 就再别玩LOL了 K大师在纸上画了一行n个格子 要小明和他交替往其中填入字母 并且 1 轮到某人填的时候 只能在某个空格中填入L或
  • AtCoder Beginner Contest 332 G. Not Too Many Balls(最大流转最小割 dp)

    题目 n n lt 500 种球 第i种有ai 0 lt ai lt 1e12 个球 m m lt 5e5 个盒子 第j个能放bj 0 lt bj lt 1e12 个球 特别地 第j个盒子最多能放i j个第i种球 求m个盒子能放的最多的球的
  • 插入数计数类 / 转为换行类dp:AT_agc024_e

    https www luogu com cn problem AT agc024 e 首先题目可以转化成每次插入一个数 满足字典序递增 如果只考虑暴力dfs 先别上dp 想想怎么合法和不算重 合法 也就是插入数有3种情况 插到末尾 插到比他

随机推荐

  • wireshark 导出指定tcp流的数据包

    数据包回放时 如果我们只想将pcap包中的部分数据进行回放 怎么办呢 首先使用wireshark打开文件 在过滤器中进行过滤 比如我只想要tcp stream eq 0的数据 可以如下操作 过滤好数据 然后依次操作 文件 gt 导出特定分组
  • 离散余弦变换

    离散余弦变换 DCT for Discrete Cosine Transform 是与傅里叶变换相关的一种变换 它类似于离散傅里叶变换 DFT for Discrete Fourier Transform 但是只使用实数 离散余弦变换相当于
  • 三、PCL点云处理滤波器----(1)直通滤波器

    一 为什么要进行滤波 在获取点云数据时 由于设备精度 操作者经验 环境因素等带来的影响 以及电磁波衍射特性 被测物体表面性质变化和数据拼接配准操作过程的影响 点云数据中将不可避免地出现一些噪声点 实际应用中除了这些测量随机误差产生的噪声点之
  • ImportError: No module named cv2的完美解决方法!!!(不能太赞)

    此刻是2018年1月21日晚10点13分 我怀着激动的心情 从Ubuntu系统上登上我的CSDN博客然后发来贺电 祝贺我自己解决了ImportError No module named cv2的问题 这仿佛是从另一个世界 Ubuntu世界
  • L1-043 阅览室(java)

    1 题目描述 天梯图书阅览室请你编写一个简单的图书借阅统计程序 当读者借书时 管理员输入书号并按下S键 程序开始计时 当读者还书时 管理员输入书号并按下E键 程序结束计时 书号为不超过1000的正整数 当管理员将0作为书号输入时 表示一天工
  • 【系统函数】2. 系统的因果性、稳定性

    1 系统的因果性 系统的因果性 非因果性 连续因果系统的充要条件 离散因果系统的充要条件 2 系统的稳定性 系统稳定的必要性 稳定系统 连续系统 是 稳定系统 的充要条件 离散系统 是 稳定系统 的充要条件 因果系统 是 稳定系统 的充要条
  • 2012,改变AGI命运的180天

    2012年12月初的一天 一场秘密竞拍正在美国滑雪胜地太浩湖 Lake Tahoe 的一家赌场酒店里进行 太浩湖位于加州和内华达州交界处 是北美最大的高山湖泊 拥有蓝宝石般的湖面和顶级雪道 教父2 曾在这里取景 马克吐温曾在此地流连忘返 而
  • 关于ESD静电测试以及实际案例的修改(怎么让你的PCB更加好过ESD)

    背景 最近楼主的两个项目客户要求要过ESD测试 分别是4KV和8KV的空气放电和4KV的接触放电 其中一个MCU的ESD保护做得比较好 还有就是产品设计比较简单 没有USB 蓝牙这些 所以ESD过也是稳稳的 不加TVS管也是过了 另外一个就
  • Python使用tkinter开发一个简单的参数计算软件模板,可用于设计估算,制造业算料,各种包含参数变量的简单计算

    一 开发前因 最近在制造业转了一圈 发现很多传统制造业在设计或者加工下料过程中 需要根据一些固定参数和现场实际的变量 去估算出设计的范围值或者所需要的材料用量 这种计算当然都会有固定的参数和变量组成的公式 但是现场的计算方式感人 要么用计算
  • C#:复制文件显示进度条

    1 窗口界面 主要是文本框textBox 按钮button 进度条prograssBar三大组件所组成的 2 完整代码 using System using System IO using System Windows Forms usin
  • [JAVAee]Linux上的javax.mail报错

    我们把在window写的项目部署到Linux上的Tomcat时 如果发现使用不了了 该如何找到错误呢 找到报错的地方在哪呢 在Linux环境下来到Tomcat目录下的logs目录 输入 tail f catalina out n 500 t
  • JDK安装步骤

    安装过程 新建文件夹 新建文件夹 首先新建两个路径 D java jdk和D java jre 代表我把Java安装到D盘下的java路径下 在该路径下要新建两个路径 一会儿放jdk和jre 安装过程 安装过程 1 默认是这个路径 更改一下
  • Linux与Windows操作系统之间的技术差异与迁移

    引言 操作系统是计算机领域中的核心组成部分 为我们提供了统一且可靠的计算环境 Linux和Windows作为最广泛使用的操作系统之一 在技术层面存在着显著的差异 当我们从一个操作系统迁移到另一个操作系统时 可能会面临一些技术挑战 本文将着重
  • openGauss学习笔记-68 openGauss 数据库管理-创建和管理普通表-向表中插入数据

    文章目录 openGauss学习笔记 68 openGauss 数据库管理 创建和管理普通表 向表中插入数据 68 1 背景信息 68 2 操作步骤 68 2 1 向表customer t1中插入一行 68 2 2 向表中插入多行 68 2
  • QT从入门到实战x篇_02_创建第一个Qt工程:创建工程、代码含义、模块、命名规范、快捷键、帮助文档快捷方式

    1 创建一个Qt工程 请参考之前的文章 如何在qcreate中创建一个程序 2 程序中代码的具体含义 整体结构如下 1 pro文件 就是一个工程文件 其中一般不要加注释 低版本的 pro解释 pro就是工程文件 project 它是qmak
  • 9.5-9.9 小知识点

    目录 1 什么是静态文件 django静态文件配置如何配置 如何解决接口前缀不断变化 html页面上路径的引用需要反复修改的问题 2 request对象的方法有哪些 分别是干什么用的 请具体阐述细节及注意事项 3 django自带的数据库是
  • 算法——判断有向图是否有回路

    思路 一 借助AOV的拓扑排序算法来对整个有向图进行排序 拓扑排序算法 1 统计所有节点的入度 2 把所有入度为0的节点入栈 3 在栈不为空的条件下把栈顶元素一个一个的弹出 并把与此节点相连的节点 即此节点指向的节点 的入度减一 再判断入度
  • Chromium命令行开关列表2

    Chromium命令行开关列表 Google Chrome浏览器可以使用很多命令行 一些更改功能的行为 其他用于调试或试验 该页面列出了可用的开关 包括其条件和说明 上一次自动更新发生在2020 08 12 Condition Explan
  • C51实现流水灯

    文章目录 一 实验要求 二 实验代码和原理图 1 代码 2 原理图 总结 一 实验要求 1 先八盏灯从左至右依次点亮 同一时刻仅有一盏灯处于被点亮状态 每盏灯亮0 5s 然后八盏灯从右至左依次点亮 同一时刻仅有一盏灯处于被点亮状态 每盏灯亮
  • hdu 1074 Doing Homework

    Problem acm hdu edu cn showproblem php pid 1074 题意 n 份作业 分别给出名字 完成所需时间 cost 最迟上交时间 deadline 作业每迟交一天扣一分 问最少的扣分数 Analysis