Bamboo和人工ZZ 题意: 非常直白,经典的动态规划矩阵链乘问题 分析: 矩阵链A1A2..An满足结合律,可以使用加括号的方式,降低运算代价. 一个pq的矩阵和一个qr的矩阵相乘,计算代价为pqr 加括号时满足动态规划的特性 长度为1的矩阵不需要加括号 长度>=2的矩阵链AiAi+1.....Aj,势必在 Ak和Ak+1之间加括号,分成的两组中各自的加括号方案已经是最优的了. 以m[i][j]表示Ai-Aj矩阵链乘的代价,则 核心语句: i=j m[i][j]=0; i<j m[i][j…
Bamboo and the Ancient Spell 分析 可能英文读题难度比较大,但是只要看到全大写的 "THE LONGEST COMMON SUBSEQUENCE !"应该就清楚这是考什么的了. 最长公共子序列:可以不连续.序列长度很大时,暴力方法非常费时,这也是一道比较经典的<算法导论>上的动态规划题. 设序列X=<x1, x2, -, xm>和Y=<y1, y2, -, yn>的一个最长公共子序列Z=<z1, z2, -, zk&…
940 AlvinZH的最"长"公共子序列 思路 DP,难题. \(dp[i][j]\) :记录A的前i个字符与B的前j个字符变成相同需要的最小操作数. 初始化:dp[i][0] = i, dp[0][i] = i.分别代表i次删除or添加操作. 三种操作得到dp[i][j],取其中最小值: 替换:可能不需要替换,所以是dp[i-1][j-1]+Same(A[i-1],B[j-1]): 删除:dp[i-1][j]+1: 添加:dp[i][j-1]+1. 千万不要纠结操作的序列是A还是B…
978 AlvinZH的1021实验plus 思路 贪心,中等题. 使用miss变量表示未覆盖的最小数字,初始值为1. 初始覆盖区间为[1,miss),目标是覆盖[1,m],即miss需要大于m. 需要比较miss和数组里没有使用的数字中最小的数字x(所以需要先给数组排序. miss更小:没有一个组合可以满足需要的值,需要插入该值,即插入miss,这时覆盖区间变成 \([1,miss<<1)\) . miss更大:当前可以覆盖[1,miss),加上此值,覆盖区间变为 \([1,miss+x)\…
1019 ModricWang的序列问题 思路 此题题意非常清晰,给定一个序列,求出最长上升子序列的长度.从数据规模来看,需要\(O(nlogn)\) 的算法. \(O(nlongn)\) 求最长上升子序列的做法如下: 维护一个数组\(f[]\) ,其中\(f[i]\) 表示当前步骤下长度为i的上升子序列的末尾元素的最小值. 需要注意的是,\(f[i]\) 一定是单调递增的,这个结论十分显然,这里就不做证明了. 使用动态规划思想,对于原序列中的每个元素,都拿去更新一次\(f[]\) .假设当前元…
1021 ModricWang的序列问题II 思路 此题与上一题区别不是很大,只是增加了一个长度限制,当场通过的人数就少了很多. 大体解题过程与上一题相同.区别在于对\(f[]\) 的操作.没有长度限制的时候,\(f[]\) 的更新策略是立即更新.假设间隔为\(T\),现在由于需要考虑间隔,那么在处理第\(i\) 个元素的时候,就需要看到 前\(i -T\) 个元素生成的\(f[]\) ,而不能受到第\(i-T+1\) 到 \(i-1\) 个元素的干扰.因此,考虑如下操作:每次准备更新\(f[]…
975 AlvinZH的1021实验 思路 贪心,简单题. 题目已经说明有且只有一种方法表示所求数,简单列举几项可以发现只由前i个砝码会可以表示[1,∑Wi]的所有数的.先找到最大需要的砝码Wi,问题变成了表示(n-Wi),可递归,可循环.见看考代码一. 本题亦可联想到三进制,思路清奇.可以参考段柯宇同学的题解. 分析 简单讲讲为什么,贪心在哪里.令W[6]={1,3,9,27,81,243}表示砝码重量,Sum[6] = {1,4,13,40,121,364}表示前i个砝码总和. 可以发现W[…
Bamboo之吃我一拳 分析 当两个点的距离<=d时,才可以出拳,想要使得满足出拳条件的点对最少但不为0 寻找最近点对距离,得到的最近距离能够使得可以出拳的组数最少,因为除了最近点对外其他组合均不符合条件. 在一堆点中找到两个点的距离最小,暴力的O(n^2)计算量很恐怖,可以用分治思想把问题变小: 把平面上的点分为两拨,距离最近的两个点只可能出现在:第一堆,第二堆,和两堆2中各自一个点 分解 想象一条垂直线把所给点集分成两拨:所有的点要么在直线左边,要么在其右边.按x坐标升序排列. 解决 划分后…
Bamboo之寻找小金刚 分析 可以抽象为许多连续线段,分别计数左拐和右拐的个数.考察叉积的基础应用. 假设ABC三点构成一个夹角∠ABC,B就是拐点,AC是辅助形成夹角.考虑线段AB和BC形成的向量 sin∠ABC= (AB * BC)/|AB|*|BC| 两个向量的叉乘除以它们的模 所以叉乘可以判断夹角是否大于180°从而确定转向.当然叉积是有方向的,可以自己选择哪条边在前,只要标准统一即可.每三个点组成一组,遍历,分别计数左拐数和右拐数.具体叉积相关操作可以看<算法导论> 注意 常见的一…
1064 Bamboo和"Coco" 分析题意 每个亡灵至少一个花瓣,相邻的亡灵中思念值高的要获得的花瓣高(思念值相等是不需要花瓣一样多的).主要考贪心思路,为了使得花瓣总量最少,每次比思念值更低的"邻近亡灵"的花瓣数多一就可以了 思路 都是先保证每个亡灵至少一个花瓣 思路一 直接模拟思路,同时关心左边和右边(或者说前边和后边),一次循环是不够的,比如3 2 1,修改了1号的花瓣数,再修改2号的花瓣数,此时会对一号产生影响.需要多次遍历,直到没有新的改变为止,算法为…