[树形dp] Luogu P2230 Tinux系统
题目描述
在dos系统诞生以前,美国曾研究出一种类似的操作系统,名为Tinux系统。但由于硬件设施的制约,Tinux系统有许多的缺点。下面就对Tinux系统作一个简单的介绍:
Tinux系统是Tiger博士为美国军方研制开发的一种操作系统,该系统对文件的存储方式类似于dos系统,像一棵树一样,每一个叶子节点表示一个文件,每一个非叶子节点表示一个目录。其中定义i级子目录表示从根目录开始访问,一直访问到该子目录(不包括该子目录)需要访问的目录的个数为i的目录,所以根目录下的目录为一级子目录,其他的目录以此类推。但是在同一子目录下,受到硬件的制约Tinux系统最多只能够存储k个文件或子目录,也就是说这棵树里面的每一个非叶子节点最多只有k个子节点。这样就导致在文件数量较多的情况下,访问存储在该系统当中的文件A,往往要先访问一系列的子目录,我们称这些子目录为文件A的上级目录。例如下面这一个例子:
Root A1
A2
A3
A4
A4A1
A4A2
A4A2A1
A4A2A2
A4A3
当我们要访问文件A4A2A1时就必须先访问它的上级目录:一级子目录A4和二级子目录A4A2。
Tinux系统在存储文件时,给每一个子目录都分配了k个指针,分别指向存放在该目录下的每一个文件和每一个目录,因此对文件的访问实质上就是对指针的访问。但是由于硬件原因,这k个指针不尽相同,因此访问它们的时间也不同,访问第i个指针所耗费的时间为 。但是对于两个不同的子目录(不管它们各自属于哪一级目录)而言它们各自所拥有的k个指针是相同的。
Tinux系统最大的缺点是访问一个目录时,必须把该目录下所有的文件读入到内存当中来,这些文件包括在其各级子目录当中的文件,例如上面那一个例子,访问A4那一个目录,就必须把A4A1,A4A2A1,A4A2A2,A4A3这四个文件都读入到内存当中来,访问一个目录所需要的时间为 (x表示该目录及其各级子目录下文件的个数, 表示指向该目录的指针的访问时间)。因此根据上面介绍的访问方法,单独访问一个文件所需要的总时间为访问其所有上级目录(不包括根目录)所需要的时间与访问指向该文件的指针所需要的时间的和,例如上面那一个例子,访问文件A4A2A1需要的时间=访问目录A4的时间+访问目录A4A2的时间+访问指向文件A4A2A1的指针需要的时间。
现在,tiger博士准备将n个文件存储到一个空的Tinux系统当中,希望你帮助他设计一个程序找到一种最优的存储方法,使得单独访问这n个文件所需要的时间总和最小。
题解
-
f[i][j]表示i个物品,使用j个指针的最小费用,f[i][j]=min{f[j-1]+g[t][j]}
-
g[i][j]表示当前指针为j,使用了i个物品,g[i][j]=min{f[i][l]+p[j]*i*i)
-
初值f[1][1],g[1][x],做到i时给f[1]赋值
-
于是复杂度就是O(n^2*k)
代码
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 const int N=1010,inf=2147483647; 7 int n,k,p[153],f[N][N]; 8 int MIN(int x,int y) { return !x?y:min(x,y); } 9 int dp(int x,int y,int l) 10 { 11 if (x==1) { f[x][y]=p[y]; return f[x][y]; } 12 if (y==k) { f[x][y]=p[y]*x*x+dp(x,1,x-1); return f[x][y]; } 13 int r=k-y+1; 14 if (r*l<x) return inf; 15 if (f[x][y]) return f[x][y]; 16 r=(x-1)/r+1; 17 for (int i=r;i<=l;i++) 18 if (i==1) f[x][y]=p[y]+dp(x-1,y+1,x-2); 19 else f[x][y]=MIN(f[x][y],dp(x-i,y+1,x-i-1)+dp(i,1,i-1)+p[y]*i*i); 20 return f[x][y]; 21 } 22 int main() 23 { 24 scanf("%d%d",&n,&k); 25 for (int i=1;i<=k;i++) scanf("%d",&p[i]); 26 sort(p+1,p+1+k),printf("%d",dp(n,1,n-1)); 27 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 为DeepSeek添加本地知识库
· .NET程序员AI开发基座:Microsoft.Extensions.AI
· 精选4款基于.NET开源、功能强大的通讯调试工具
· 数据不出内网:基于Ollama+OneAPI构建企业专属DeepSeek智能中台
· 大模型工具KTransformer的安装