【LibreOJ】#6395. 「THUPC2018」城市地铁规划 / City 背包DP+Prufer序
【题目】#6395. 「THUPC2018」城市地铁规划 / City
【题意】给定n个点要求构造一棵树,每个点的价值是一个关于点度的k次多项式,系数均为给定的\(a_0,...a_k\),求最大价值。\(n \leq 3000,k \leq 10\)。
【算法】背包DP+Prufer序
首先每个点度x的价值g(x)可以暴力预处理。将每个点的度-1后,就不再有树形态这个限制了,只要n个点的度加起来是n-2即可,因为此时只要让所有还原后度不为1的点连通,度为1的叶子节点直接分配。
问题转化为n-2个大小为x价值为g(x+1)的物品,求容量为n-2的完全背包的最大价值,复杂度\(O(n^2)\)。
这里的背包有个问题,就是大小为0的物品也是有价值的(必须n个点都计算),我的方法是所有价值先减g(1),最后再加n*g(1)。
构造方案的时候可以用n^2数组记录,也可以一步一步找最优大小退容量(因为是完全背包),每个点向上一个点连边使度不为1的点构成一条链,再从后往前分配叶子节点。
注意:根节点没有向上的路径,但是为了方便背包DP依然减掉一个度,最后构造方案的时候默认第一个点为根节点不往上连边即可。
还有要特殊处理n=1和n=2的情况,\(0^0=1\)。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=3010,MOD=59393;
int n,kind,as[20],g[maxn],f[maxn];
int main(){
scanf("%d%d",&n,&kind);
for(int i=0;i<=kind;i++)scanf("%d",&as[i]);
if(n==1){printf("%d %d",n-1,as[0]);return 0;}
for(int i=1;i<n;i++){
int x=1;
for(int j=0;j<=kind;j++){
g[i]=(g[i]+x*as[j])%MOD;
x=x*i%MOD;
}
if(i!=1)g[i]-=g[1];//
}
for(int i=1;i<=n-2;i++){
for(int j=i;j<=n-2;j++){
f[j]=max(f[j],f[j-i]+g[i+1]);
}
}
printf("%d %d\n",n-1,f[n-2]+n*g[1]);//
int x=n-2,id=0,y=n;
while(x){
for(int i=1;i<=x;i++)if(f[x-i]+g[i+1]==f[x]){
x-=i;
if(++id!=1)printf("%d %d\n",id-1,id);else i++;//
for(int j=1;j<i;j++)printf("%d %d\n",id,y--);
break;
}
}
if(n==2)id++;
printf("%d %d\n",id,id+1);//
return 0;
}
有没有发现算法里还有”Prufer序“这一项?很有意思的是,上面推到的结论就是Prufer序的结论。
从Prufer序的角度来考虑,题目和带标号无根树、点度密切相关,可以想到只需要构造一个Prufer序使得各点度+1的价值最大就行了。
问题转化为n-2个大小为x价值为g(x+1)的物品,求容量为n-2的完全背包的最大价值,复杂度\(O(n^2)\)。
【LibreOJ】#6395. 「THUPC2018」城市地铁规划 / City 背包DP+Prufer序的更多相关文章
- 【LibreOJ】#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop 线段树+完全背包
[题目]#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop [题意]给定一个长度为n的物品序列,每个物品有价值.不超过m的重量.要求支持以下三种操作:1.物品价值区间加减,2.物 ...
- 【LibreOJ】#6392. 「THUPC2018」密码学第三次小作业 / Rsa 扩展欧几里得算法
[题目]#6392. 「THUPC2018」密码学第三次小作业 / Rsa [题意]T次询问,给定正整数c1,c2,e1,e2,N,求正整数m满足: \(c_1=m^{e_1} \ \ mod \ \ ...
- 【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp
题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了 ...
- LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配
#2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配
#2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- LibreOJ #2036. 「SHOI2015」自动刷题机
#2036. 「SHOI2015」自动刷题机 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 曾经发明了信号增幅仪的发明家 SHTSC 又公开 ...
- 「bzoj1003」「ZJOI2006」物流运输 最短路+区间dp
「bzoj1003」「ZJOI2006」物流运输---------------------------------------------------------------------------- ...
- 「bzoj1925」「Sdoi2010」地精部落 (计数型dp)
「bzoj1925」「Sdoi2010」地精部落---------------------------------------------------------------------------- ...
- BZOJ.4753.[JSOI2016]最佳团体(01分数规划 树形背包DP)
题目链接 \(Description\) 每个点有费用si与价值pi,要求选一些带根的连通块,总大小为k,使得 \(\frac{∑pi}{∑si}\) 最大 \(Solution\) 01分数规划,然 ...
随机推荐
- 绕WAF&安全狗新姿势
俗话说只要思路宽,绕狗绕的欢.前段时间我有尝试着用以下的方法绕狗,效果还不错.不过这方法呢也许这段时间可以绕过,过段时间可能就失效了,大家还是要多去尝试找到更多的方法. 举例-->整型注入 绕过 ...
- PAT甲题题解-1038. Recover the Smallest Number (30)-排序/贪心,自定义cmp函数的强大啊!!!
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789138.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- PAT甲题题解-1040. Longest Symmetric String (25)-求最长回文子串
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789177.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- PAT甲题题解-1044. Shopping in Mars (25)-水题
n,m然后给出n个数让你求所有存在的区间[l,r],使得a[l]~a[r]的和为m并且按l的大小顺序输出对应区间.如果不存在和为m的区间段,则输出a[l]~a[r]-m最小的区间段方案. 如果两层fo ...
- 剑指offer:二叉树的镜像
题目描述: 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / ...
- Android的环境搭建
尽管以前并没有接触过软件开发.但是,现在网络资源实在是太丰富了.所以网搜了一下,认为Android的环境搭建可分为以下五个步骤来完成.第一步:安装JDK:第二步:配置Windows上JDK的变量环境: ...
- DHCP中续代理
什么是DHCP中继代理? 答:DCHP中继代理(即DHCP Relay Agent )用于转发来自于另一个没有DHCP服务器子网段中的客户端的DHCP请求,即当一台DCHP客户机发起请求后,此时DH ...
- Android : Error inflating class android.support.design.widget.NavigationView
之前一直没搞定的,今天终于解决了. Android报错: android.view.InflateException: Error inflating class android.support. ...
- Linux命令(十三) 建立目录 mkdir 删除目录 rmdir
一.建立目录 mkdir 命令简介 mkdir 命令用于创建指定的目录.创建目录时当前用户对需要操作的目录有读取权限.如果目录已经存在,会提示报错并推出. mkdir 可以创建多级目录. 常用参数说明 ...
- 微信 小程序组件 加入购物车全套 one wxss
//1,wxss /*外部容器*/ .container { display: flex; flex-direction: column; align-items: center; justify-c ...