【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)\)。
转载于:https://www.cnblogs.com/onioncyc/p/9052946.html
【LibreOJ】#6395. 「THUPC2018」城市地铁规划 / City 背包DP+Prufer序相关推荐
- 在小树林飞也能又快又稳,这是港科大沈劭劼组的「猛禽」无人机重规划框架(这也符合我理想中的无人机,而且他们这说明这种室内避障无人机是可以做得很小的。)
这也符合我理想中的无人机,而且他们这说明这种室内避障无人机是可以做得很小的. 摘自:https://mp.weixin.qq.com/s/xzY3GOLzd4fgy7Ff-cSigg 在小树林飞也能又 ...
- 【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp
题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了 ...
- LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配
#2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 小 ...
- 「THUPC2018」赛艇 / Citing
https://loj.ac/problem/6388 矩形匹配,小地图经过位置为1,和大地图匹配不能同时存在一个1的位置,就可以是一个当前位置 1.bitset压位,....O(n^2m^2/64) ...
- #6398. 「THUPC2018」生生不息 / Lives
放一份爆搜代码(能跑过所有数据,5 5 在十分钟左右?): #include<bits/stdc++.h> #define rep(i,x,y) for(register int i = ...
- 【LOJ6178】 「美团 CodeM 初赛 Round B」景区路线规划 期望概率DP
题目链接 LOJ 题解 考虑进行Dp,我们设 f[i][j] f [ i ] [ j ] f[i][j]表示到达节点 i i i消耗了j" role="presentation&q ...
- 「THUPC2018」生生不息 / Lives(状压 + 记忆化搜索 + 打表)
题目链接:https://loj.ac/problem/6398 题目大意: 生命游戏是一个经典的零玩家游戏. 游戏在一块 n \times mn×m 的方格棋盘上进行,初始时,棋盘上的一些格子中有生 ...
- 「BJOI2019」奥术神杖(AC自动机+DP)
文章目录 title solution code title solution 令Magic=Vi×Vj×Vk...Magic=V_i\times V_j\times V_k...Magic=Vi× ...
- 「APIO2010」 特别行动队 - 斜率优化Dp
题目描述 你有一支由nnn名预备役士兵组成的部队,士兵从1到nnn编号,要将他们拆分成若干特别行动队调入战场.出于默契考虑,同一支特别行动队中队员的编号应该连续,即为形如(i,i+1,...,i+k) ...
最新文章
- Scrapy框架CrawlSpider类爬虫实例
- 使用IIS组建PHP服务器
- win32: 查询滚动条相关信息的注意事项
- 超级干货:你应该知道的那些编程原则!!
- 点云处理软件Pointscene
- mysql重新构建自增长_mysql 建表后 重新构建 自增字段 (保留 原有字段结构)
- 在 SSD 上使用 btrfs 文件系统的相关优化
- VC2010 sp1修复补丁
- 【交易架构day9】阿里交易系统演进之路
- DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unico
- hive优化:大表关联数据倾斜问题
- “盛大游戏杯”—K 购买装备
- 【安信可首款4G模组CA-01直连阿里物联网平台②】一机一密认证方式连接
- 树莓派用root登陆_树莓派开启root用户权限
- 【转载】eMule电驴使用从入门到精通(4)-------电驴宗旨:我为人人,人人为我
- stored-program Computer/von Neumann Architecture 冯诺依曼体系结构
- 龙王我当定了(一个在QQ刷龙王的脚本)
- SuperSet连接mysql设置
- 最简单明了的QQ在线客服代码
- 判断设置了css省略号样式的元素是否出现了省略号