对于蓝竹笋的初步研究(与xjbl)

某一天当我还是个萌新,在东北玩泥巴雕塑园看着攻略连馒头的时候,突然

于是我陷入了深深的撕烤,哦不,思考【然后就把这事儿给鸽了,对方可是蓝莓啊喂

@Amastacia大佬我错了

--------------------------------------------鱼唇的分割线--------------------------------------------

我要讲啥来着、、、哦利用动态规划解决问题

具体是什么问题呢:造竹笋by 这位蓝莓

本人画图可好啦!于是画了个二重竹笋卖个萌

显然对于竹笋,给出一个图案,一定是能按照一定顺序连出来的,因此顺序并不重要

重要的是,怎么连【凑字数的废话

好,先来看一个naive的问题:n重竹笋要多少个portal?

$CNT[n] = 3 + 3^{0} + 3 ^{1} + ... + 3^{n-2} = \frac{3^{n} - 1}{2} + 3$

然后蓝莓的要求是

也就是$CNT = 124$个点。。。

$O(n^4)$的算法差不多能满足要求

--------------------------------------------更鱼唇的分割线--------------------------------------------

以下为技【cou】术【zi】部分:

$Sol 1.$

假设每个portal的坐标已经确定,不妨先设刚好有$n = 124$个点,且能够组成一个六重竹笋

令$f[i][j][k]$表示以$i、j、k$三点为外点的竹笋的最多重数,则易知转移方程

$f[i][j][k] = max_{p \in \Delta ijk}\{min(f[i][j][p], f[i][p][k], f[p][j][k])\} + 1$

其中$f[i][j][p]$等三项一定是$f[i][j][k]$的子问题,因此只要记忆化搜索就能解决

时间复杂度$O(n^4)$,空间复杂度$O(n^3)$

评价:好像并没有什么卵用,五重应该还能用上来凑凑数

$Sol 2.$

介于@Amastacia自己的行动四层蓝竹笋已经覆盖了大半个北航校园可知无用点应当相当多,因此需要一个比较简单却高效的剪枝

$Step 1.$首先计算每个三角形内有多少po:

令$g[i][j][k]$表示以$i、j、k$三点为外点的三角形里面包含多少portal

每次选出两点$i、j$,查看其一边的点集$\{S\}$,距离从小到大排序

因此对于每个点$k$,之前的任意点$p$距离$i、j$都比它近,即

$p \in \Delta ijk \ \Leftrightarrow \  \alpha_1 < \alpha_2 \ \&\&\  \beta_1 < \beta_2$

这就可以转化成一个简单的二维坐标系某个点左下方有几个点的问题,时间复杂度$O(nlogn)$

综上,$g[i][j][k]$可以在$O(n^3logn)$的时间内求出

$Step 2.$接下来就可以瞎搞了

本着勤俭持家的原则:对于一个$g[i][j][k] \in [CNT[x], CNT[x + 1]]$

我们期望他的$f[i][j][k] = x$

因此可以对$g[i][j][k]$分类,每一类的$f$值都只与上一类有关

$n=1$时,十分trivial

$n=2$时,即所有$g[i][j][k] == 1$的$i、j、k$满足要求

$n=3$时,内部点并不多,时间复杂度为$O(13 * n^3)$

$n=4$时,内部点依旧不多,时间复杂度为$O(40* n^3)$

$n=5$时,我实在是想不出来了。。。让我们愉快的压常数吧!

$n=6$时,满足$g[i][j][k] \geqslant 121$的组合显然不多,可以期望复杂度在$O(121 * n^2)$【我猜的】

$Step 3.$愉快的压常数

n=5的时侯,对于每一个点$p$,建立矩阵M,其中$M[i][j] = [f[i][j][p] == 4]$

于是要找到所有的$(i, j, k)$,使得$M[i][j] = M[j][k] = M[k][i] = 1$,这些$(i,j,k)$即所有五重竹笋的外点

对于每一行,都可以用$int64(\_\_int128)$压成一个大整数,因此单次操作的时间复杂度为$O(\frac{n^2 * n} {2 * 64})$

总时间复杂度为$O(n^3 + \frac{n^4} {128})$【怎么有一种比$n=4$还快的错觉

综上。。。总算是搞完了。。理论复杂度在$n=200$的时候大概能做

而最少的$n=124$即可做一个六重蓝竹笋,算法复杂度还是很可观的

【你要问我$n$更大怎么办?$random\_shuffle()$大法好!

时间: 2024-10-01 03:36:54

对于蓝竹笋的初步研究(与xjbl)的相关文章

iOS多线程的初步研究(一)-- NSThread

iOS多线程的初步研究(一)-- NSThread 对于多线程的开发,iOS系统提供了多种不同的接口,先谈谈iOS多线程最基础方面的使用.产生线程的方式姑且分两类,一类是显式调用,另一类是隐式调用. 一.显示调用的类为NSThread.一般构造NSThread的线程对象可通过两种方式: 1. 初始化线程主方法: [NSThread detachNewThreadSelector:@selector(run:) toTarget:target withObject:obj];//类方法 或 NST

移动应用是大势所趋,微信开发初步研究尝试

微信在我们生活中已无所不在,几乎人手一个手机一个微信,天天刷朋友圈.而作为商家和企业应用的服务号和企业号的开发也是移动应用开发的一个新方向. 经过近期对微信开发进行初步研究,对微信开发有了一些了解,可以打通微信与数据库的查询及交互,实现一些应用系统的定制开发.接下来要做的就是根据实际业务需要来开工建设. 微信除了企业内部应用外,在商业环境的应用如支付.活动现场等的应用也是支持的较好.另外微信wifi项目也可作为一个独立分支结合无线路由器来作为一个广大的商业市场进行运作开发. 微信提供了工具和平台

iOS多线程的初步研究(四)-- NSTimer

 iOS多线程的初步研究(四)-- NSTimer 原文地址  http://www.cnblogs.com/sunfrog/p/3243230.html 理解run loop后,才能彻底理解NSTimer的实现原理,也就是说NSTimer实际上依赖run loop实现的. 先看看NSTimer的两个常用方法: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelec

对显微镜图像的初步研究

对显微镜图像的初步研究 完成一个机器视觉的项目,首先需要开发者能够理解图像.剖析出特征.提出初步的思路.对于三幅显微镜图片,原始的要求是能够以75%的成功率识别出三类物体.先看图像 一.图像主观体验 1)从总体颜色上来看,发现三幅图像的主要颜色不统一(图1偏紫,图3偏绿),应该是由切片的不同材质造成的.如果所有的切片都是属于这一色调的,可以首先考虑通过颜色域来强化ROI区域.这一点需要沟通和更多的素材: 2)从图像内容上来看,可以划分为1.背景,2.大块区域,3.小型气泡,4.大型气泡.4个区域

iOS多线程的初步研究(十)-- dispatch同步

GCD提供两种方式支持dispatch队列同步,即dispatch组和信号量. 一.dispatch组(dispatch group) 1. 创建dispatch组 dispatch_group_t group = dispatch_group_create(); 2. 启动dispatch队列中的block关联到group中 dispatch_group_async(group, queue, ^{ // ... }); 3. 等待group关联的block执行完毕,也可以设置超时参数 dis

移动应用是大势所趋,微信开发初步研究尝试(图文)

微信在我们生活中已无所不在,差点儿人手一个手机一个微信,天天刷朋友圈.而作为商家和企业应用的服务号和企业号的开发也是移动应用开发的一个新方向. 经过最近对微信开发进行初步研究.对微信开发有了一些了解,能够打通微信与数据库的查询及交互,实现一些应用系统的定制开发.接下来要做的就是依据实际业务须要来开工建设. 微信除了企业内部应用外,在商业环境的应用如支付.活动现场等的应用也是支持的较好.另外微信wifi项目也可作为一个独立分支结合无线路由器来作为一个广大的商业市场进行运作开发. 微信提供了工具和平

小米开源文件管理器MiCodeFileExplorer初步研究

2011年对着书本Android应用开发揭秘,写了2个月的HelloWorld. 现在想复习并深入,我没有耐心再去一点点地敲代码了. 4年前自己是个学生,实习,现在有工作,只能业余时间研究. 这一点是非常不同的. 我希望通过研究别人的"成熟产品",更好地全面学习. 以目标为导向,具体来说,通过研究别人的一个产品,进而全面掌握,在研究的过程中, 把若干问题都解决了,从而达成"快速进步"的目标. 我们学习Java,学习Android开发,不是为了玩玩而已,也不能紧紧是&

WebGIS中矢量切图的初步研究

1.背景 在GIS领域,金字塔技术一直是一个基础性技术,WMTS规范专门制定了针对切片请求的格式.利用这种技术,前端可以快速展示出指定级别的地图或影像. 但是,由于切图本身是一张图片,图片上看似是兴趣点的要素根本无法进行前端交互.于是,针对兴趣点等矢量数据的展示,基本原理都是先获取到矢量的地理信息(比如GeoJson),在前端绘制(内核为一个element),于是该element便能进行鼠标响应等交互了. 2.矢量数据的一般展示方法 2.1 矢量数据按需请求 根据需要,每次向服务器(比如根据地理

一款名为Blue_Moon的后台模板的初步研究

其介绍曰,Blue Moon后台管理模板是一款适合微信公众平台后台的蓝色清爽风格模板. 1 先看下其效果 表单效果: 图表效果: 界面元素:按钮等等: 表格: 左上角用户登录: 左上角部分的代码结构如下:4个li项; 2 总体结构 文件 引用了jquery, jquery ui,bootstrap,jquery.flot.js是 Flot是一个Jquery下图表插件,简单使用,交互效果, 原来下载后这货给出的文件里都是demo:是不能直接改改用的:比如tables是全部表格的效果demo,for