题目描述可能稍有偏差,但实质上是一样的。

看下面

题目大意

题面这么长,先说说题意吧。

就是有一个操作系统,他的存储方式是树形的。其中分为文件和目录(文件夹)每一个子目录下只能存储 $K$ 个文件或目录。并且有 $K$ 个指针分别指向这 $K$ 个文件或文件夹。每一个指针都有一个访问时间 $P$。

然后每一个文件或目录都有一个访问时间,文件和目录的访问时间计算方式不相同

  • 文件:访问其所有上级目录(就是这个文件访问路径上的文件夹)的访问时间加上这个文件的指针的访问时间。
  • 文件夹:它的各级子目录下文件的个数 $\times $ 它的指针的访问时间。通俗一点就是它的子树上的文件的个数为 $x$,它的指针访问时间是 $y$ 那么它的访问时间就是 $x\times y$。这里要说一下题面描述出了锅,最起码我现在看是这样的。

现在你需要计算出给出的 $N$ 个文件的最小访问时间总和。

解题思路

我看了Vijos上的题解表示并没有看懂,于是问问机房的dalao。dalao就是dalao。

这是一道树形DP。首先要明白一个贪心策略。在同一层子目录下,如果现在的剩余空间已经无法容纳剩下的文件那么我们必然是需要在开一个文件夹进行存储的。那这个文件夹开的位置的指针访问时间越小越好。因为如果它是一个文件夹的话,它对答案的影响会随着它的子目录中文件的数量增加而成倍增加。所以要尽量的小。这就是一个贪心的策略,显然在输入的时候是需要对指针的访问时间从小到大排序的。

接下来做树形dp。先看下代码,我们一段一段的讲。

int main() {scanf("%d%d", &n, &k);for(int i=1; i<=k; i++)scanf("%d", &p[i]);sort(p+1, p+1+k);printf("%d", dp(n, 1, n-1));
}

排序这一部分自然是不用多说了,上面已经说过了。

再来看dp函数

inline int dp(int x, int y, int l) {if(x == 1) {f[x][y] = p[y];return f[x][y];}if(y == k) {f[x][y] = p[y] * x * x + dp(x, 1, x-1);return f[x][y];}int tmp = k-y+1;if(tmp * l < x)return INF;if(f[x][y]) return f[x][y];tmp = (x-1)/tmp + 1;for(int i=tmp; i<=l; i++) {if(i == 1)f[x][y] = p[y] + dp(x-1, y+1, x-2);elsef[x][y] = MIN(f[x][y], dp(x-i, y+1, x-i-1) + dp(i, 1, i-1) + p[y] * i * i);}return f[x][y];
}

$x$ 表示还剩下多少个文件没有被安排。$y$ 表示现在用到的是第 $y$ 个指针。$f[x][y]$ 表示还剩 $x$ 个文件用第 $y$ 个指针的最小的访问时间。

显然如果 $x == 1$ 的话,就直接将现在这个指针的时间给它就好了。如果 $y==k$ 的话,说明 $k$ 个指针已经用到了最后一个那肯定是要建一个文件夹。

这里的 $p[y]*x*x$ 的含义呢,是将这个文件夹的访问时间计算出来并且它之后会产生 $x$ 次影响,将这 $x$ 次影响在这里直接计算出来。

$l$ 表示层数,是最多还能伸下去安排几层。$tmp$ 那个地方是一个小剪枝。如果剩余的内存还不够将这 $x$ 个文件安排好的话就直接反回 $inf$。

往后的状态转移,如果只剩下一个需要安排的话,那就直接安排上。否则的话就开一个文件夹,把除文件夹外的剩余空间进行分配,并且往下深入一层。

附上代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 1003, INF = 2147483647;
int n, k, p[153], f[maxn][maxn];
inline int MIN(int x, int y) {if(!x) return y;else return min(x, y);
}
inline int dp(int x, int y, int l) {if(x == 1) {f[x][y] = p[y];return f[x][y];}if(y == k) {f[x][y] = p[y] * x * x + dp(x, 1, x-1);return f[x][y];}int tmp = k-y+1;if(tmp * l < x)return INF;if(f[x][y]) return f[x][y];tmp = (x-1)/tmp + 1;for(int i=tmp; i<=l; i++) {if(i == 1)f[x][y] = p[y] + dp(x-1, y+1, x-2);elsef[x][y] = MIN(f[x][y], dp(x-i, y+1, x-i-1) + dp(i, 1, i-1) + p[y] * i * i);}return f[x][y];
}
int main() {scanf("%d%d", &n, &k);for(int i=1; i<=k; i++)scanf("%d", &p[i]);sort(p+1, p+1+k);printf("%d", dp(n, 1, n-1));
}

转载于:https://www.cnblogs.com/bljfy/p/9598616.html

「 Luogu P2230 」X 「 Vijos 1142 」 HXOS系统相关推荐

  1. 如何利用 C# 爬取「当当 - 计算机与互联网图书销量榜」!

    前段时间我们介绍了如何利用 C# 语言来爬取"京东 - 计算机与互联网图书销量榜" 网页的方法,通过该方法,我们能够获得"京东"的图书销售排行榜数据. 可是,读 ...

  2. 如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息!

    我们生活在一个快节奏的时代里,每天除了辛苦的提升自己,为生活打拼之外,偶尔的放松去看场电影也是必要的.可是能够抽出的时间有限,选择看哪部电影就是一个挠头的问题了. 幸好,有类似猫眼电影.豆瓣电影.淘票 ...

  3. 看动画轻松理解「链表」实现「LRU缓存淘汰算法」

    作者 | 程序员小吴,哈工大学渣,目前正在学算法,开源项目 「 LeetCodeAnimation 」5500star,GitHub Trending 榜连续一月第一. 本文为 AI科技大本营投稿文章 ...

  4. 脑洞大开!Adobe等新研究把「自拍」变「他拍」,魔幻修图效果感人

    选自arXiv 作者:Liqian Ma.Zhe Lin等 机器之心编译 编辑:蛋酱.张倩.杜伟 自拍也能变为他拍,魔幻修图界又出新招式,但效果实在感人. 智能手机的出现,让摄影变成了一项大众艺术,也 ...

  5. 一直学不明白的「递归」与「动态规划」原来这么简单

    在学习「数据结构和算法」的过程中,因为人习惯了平铺直叙的思维方式,所以「递归」与「动态规划」这种带循环概念(绕来绕去)的往往是相对比较难以理解的两个抽象知识点. 程序员小吴打算使用动画的形式来帮助理解 ...

  6. 「绩效领导力:聚焦战略目标有效落地」沙龙圆满落幕

    "6月17日下午,由互次方科技和菜根发展联合主办的「绩效领导力:聚焦战略目标有效落地」沙龙活动在中国(杭州)人工智能小镇举行." 2021年,疫情余波未平,对各行各业都造成了一定冲 ...

  7. 微信第一行代码曝光!从「扫地僧」到「地成佛」,张小龙10年磨一剑

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要5分钟 Follow小博主,每天更新前沿干货 来源:微博 编辑:卫民 [导读]腾讯官方微博今日凌晨发布了微信10年前在微信后台第一天提交的代码 ...

  8. 「特征工程」与「表示学习」

    https://www.cnblogs.com/DicksonJYL/p/9626282.html 1.表示学习 当我们学习一个复杂概念时,总想有一条捷径可以化繁为简.机器学习模型也不例外,如果有经过 ...

  9. 一文区分什么是「过拟合」和「欠拟合」?

    一文区分什么是「过拟合」和「欠拟合」? https://mp.weixin.qq.com/s/_V1Yno4FzhGdGqr6JPscpw 编译:Richard Yang 来源:Towards Dat ...

  10. 「MTA」的「錯誤訊息代碼」

    1. 什麼是 MTA? MTA(Mail Transfer Agent ):郵件傳送代理,由「郵件伺服器」扮演 MTA 角色,負責完成 MUA (郵件使用代理,即 Outlook Express 等郵 ...

最新文章

  1. 关于整合spring+mybatis 第三种方式-使用注解
  2. java dh密钥交换_java-信息安全(八)-迪菲-赫尔曼(DH)密钥交换
  3. python必背100代码-这 100 道 Python 题,拿去刷!!!
  4. 怎么学python知乎_你是怎么学习Python的 ?
  5. 生成自签名ssl证书
  6. arcball原理 旋转视图 关键点总结 及代码
  7. java try catch陷阱_Java异常处理最佳实践及陷阱防范
  8. 查看屏幕大小_疑似“iPhone 12” 的OLED屏幕组件泄露
  9. Python《爬虫初实践》
  10. 轻量级数据库sqlite的编译
  11. wow修改人物模型_一张照片生成人物动画!三星最新AI研究成果出炉
  12. Win1远程出现“这可能是由于credssp加密oracle修正”解决办法
  13. Atitit 文档全文索引的索引种类 用于文本数据挖掘 搜索 数据分析 目录 1.1. Txt摘要索引。。 1 1.2. File placeholder 索引 1 1.3. Lucence索引 1
  14. 常用的四个电路分析方法
  15. mysql grant 用户权限总结
  16. 易语言服务器客户端网络验证,超强网络验证系统附远程服务支持库
  17. 禅者的初心:乔布斯与佛教的前世今生
  18. tensorflow 机器学习资料及其工具库
  19. UnityShader学习之路(01) 漫反射
  20. 支持串口上传图片和数据到服务器的4G低功耗摄像头方案

热门文章

  1. 嫦娥五号回来要打水漂,载人回来怎么办?
  2. fatal error: alsa/asoundlib.h: 没有那个文件或目录
  3. 纽微特反省:别人犯错不敢说,那是因为自己不干活
  4. 管理感悟:减少代码量的好办法
  5. LinkedList的线程安全解决办法
  6. 设置GRUB菜单密码
  7. 微型计算机基础知识提纲,自考“微型计算机应用基础”自考大纲(6)
  8. hiveserver2启动不起来_125踏板车电启动发不着时,为什么很少用户使用脚启动?...
  9. java矩阵相乘泛型_21.8 实例学习:泛型矩阵类
  10. 测量学用C语言编程求子午线弧长,GPS数据解析 数据拆分 坐标转换 显示线路图源代码...