随笔分类 -  算法--动态规划/贪心/基础算法

摘要:1、如果田忌剩下的马中最强的马都赢不了齐王剩下的最强的马,那么应该用最差的一匹马去输给齐王最强的马。 2、如果田忌剩下的马中最强的马可以赢齐王剩下的最强的马,那就用这匹马去赢齐王剩下的最强的马。 3、如果田忌剩下的马中最强的马和齐王剩下的最强的马打平的话,可以选择打平或者用最差的马输掉比赛。 设表示齐王按从强到弱的顺序出马和田忌进行了i场比赛之后,从“头”取了j匹较强的马,从“尾”取了i-j匹较弱的马,所能够得到的最大盈利。 状态转移方程如下: 注意边界条件的判定View Code // Code by yefeng162... 阅读全文
posted @ 2013-01-17 12:41 yefeng1627 阅读(336) 评论(0) 推荐(0)
摘要:浅谈贪心思想在动态规划中的应用 -----黄劲松 论文中的例题,其中也附有详接 讲讲自己的理解吧. 题目所求为, 使用某种特定策略,使从根节点rt ,依次到每个叶子节点最少步长. 再除以叶子节点数量. 即为最终期望值. 对于一个以 rt 为根的子树上, 我们将其分为 House在子树rt上的步长总数Fa , 以及不在子树上步长总数Fb: 表示 House 在 该rt为根子树上的 步长总数 表示House 不在 该rt为根子树上的 步长总数 表示 该子树上 叶子节点数量 则所求期望为: 若节点 u, 有 k 个子节点, 按照 s1... 阅读全文
posted @ 2013-01-16 22:16 yefeng1627 阅读(519) 评论(0) 推荐(0)
摘要:我们把 放置在 第 I 行的炮兵 称为 I 行炮兵, 通过观察我们可以得出, 第I行炮兵只受 I-1 行,I-2行的 放置情况影响. 对于第Y列,有三种情况: P[x] = 0, i-1 行 空 i-2 行 空 P[x] = 1, i-1 行 空, i-2 行放置了炮兵 P[x] = 2, i-1 行 放置炮兵 (因为 此行放置了炮兵, 哪怕 I-2行 空,对于 I行而言,也毫无意义) 因为这题与 1038不同, 若当前位置为平原, 只影响当前层,而对下一层无影响,所以我们不能将 平原和高山 情况合并到状态中, 其实直接单点考虑也没事. ... 阅读全文
posted @ 2013-01-16 15:37 yefeng1627 阅读(513) 评论(0) 推荐(0)
摘要:把底边贴着第 x 行底边放置的芯片 称为第 x 行芯片。 由于芯片长度只有 3, 所以第 x 行芯片的放置只受 x-1行 和 x-2 行放置情况的影响。 同时由于一旦 方格 (x-1, y)被黑色记号或其他芯片 占据,则方格(x-2,y)即便空闲对第 x行芯片的放置也毫无意义。 所以,只需记录的状态只有: 一, a[x] = 0 表示方格(x-1,y)空闲,方格(x-2,y)空闲 二, a[x] = 1 表示方格(x-1,y)空闲,方格(x-2,y)被占据 三, a[x] = 3, 表示方格(x-1,y)被占据 意味着对于 I 层, 其状态 J, 保存着 I,I-... 阅读全文
posted @ 2013-01-15 20:17 yefeng1627 阅读(1929) 评论(0) 推荐(1)
摘要:状态表示 前 i 行状态为 mask的 合法方案数量 状态转移方程为 其中 状态 j,k 满足条件 j & k = 0, j & ( j <<1) = 0, k & ( k <<1 ) = 0 ,且 J,K状态种植点合法 因为两层间种植的点, 不可以上下相邻 所以有 J&K = 0 因为同层间,种植点不可 两两相邻, 所以有 J & ( J << 1 ) = 0 , K & ( K << 1 ) = 0 再而, 对于当前层, 某些点不可以 种植, 某些可以种植, 因为只有12位, 我们可以映射到一个 阅读全文
posted @ 2013-01-14 22:20 yefeng1627 阅读(186) 评论(0) 推荐(0)
摘要:dp(t,x,y) 表示 t时刻,锤子放到 (x,y) 点,打地鼠最高分 状态方程: dp(t, x, y) = Max { dp(t,x,y),dp(t-1,x1,y1)+ sum(x,y,x1,y1) } 其中 sqrt( (x-x1)^2 + (y-y1)^2 ) <= d, sum(x,y,x1,y1)表示 以 (x,y),(x1,y1)为端点的线段上 地鼠数量 对于 已知两端点 (x1,y1),(x2,y2)的线段,求其线段上 合法点个数,有多种方式: 一, 利用 直线方程来解, 若 x1==x2 或 y1 == y2 斜率不存在的特殊情... 阅读全文
posted @ 2013-01-14 20:24 yefeng1627 阅读(243) 评论(0) 推荐(0)
摘要:因为 除了终点外,中途点 位置 高度皆为 Y[1], 我们可以通过 横坐标唯一确定当前状态 所以 定义状态: DP(I,K) 表示经过 第I栋 Building 移动到 K位置,最小 swap次数 则 转移方程为: 注意到, 因为我们是从 I = 1, 2, 3. ... ,N 顺序处理, dp(k)位置保存着 最优值, 所以第一维 I 我们可以省去 得到转移方程: 对于处理到 第I栋时, 枚举 Xi 到 最大横坐标 ,注意 非法状态的判定, 因为都是顺序处理的,若目前不合法,则后面状态也不合法解题代码View Code #include<stdio.... 阅读全文
posted @ 2013-01-14 15:24 yefeng1627 阅读(267) 评论(0) 推荐(0)
摘要:题目大意: 一个 R*C的矩阵,每个格子内有两种矿yeyenum和bloggium,并且知道它们在每个格子内的数量是多少。 如图所示,最北边有bloggium的收集站,最西边有 yeyenum 的收集站。 传送带只有一个方向直达收集站才有效,不可转弯。 现在要你在这些格子上面安装向北或者向西的传送带(每个格子自能装一种)。问最多能采到多少矿(yeyenum+bloggium)? 定义状态 dp(I,J)表示 前I行,J列,Y+B矿最大值 因为对于任一矿地添加 传送带,仅当其 连接带对应 边界的 收集站时,才有效,且不可弯曲, 所以,对于当前一点 (I,J),其包... 阅读全文
posted @ 2013-01-13 18:06 yefeng1627 阅读(305) 评论(0) 推荐(0)
摘要:不得不说这题,为什么习惯把 X轴,Y轴 颠倒过来........ 假设 S(X,Y) 表示以 (1,1)为左上角坐标, (X,Y)为左下角的矩形内部 树的数量, 那么有 S(X,Y) = S(X-1,Y)+ S(X,Y-1) + Vis(X,Y) // Vis 表示 X,Y点是否有树,若有则为1,否则为0 我们可以通过 O(N*M)时间预处理出 S(X,Y) 然后对于 DP(X1,Y1,X2,Y2) : 以(X1,Y1)为左上角,(X2,Y2)为左下角的 矩形内部 树数量,有 DP(X1,Y1,X2,Y2) = S(X2,Y2) - S(X2,Y1-1)-S(X1... 阅读全文
posted @ 2013-01-13 14:35 yefeng1627 阅读(214) 评论(0) 推荐(0)
摘要:对于 串 Str(I,J)构成 回文串, 一,其可以由 子串Str(I+1,J)构成的回文串 D(I+1,J) 再通过在最右添加字符S(I)构成 二,也可以由 字串Str(I, J-1)构成的回文串 D(I, J-1) 再通过在最左边添加字符 S(J)构成 三,当 S(I) == S(J)时,两个边界不花费总是最优,我们可以由 子串Str(I+1,J-1)构成的回文串 D(I+1,J+1)构成 所以,可以定义状态 DP(I,J)表示 串 Str(i,j)构成回文串最小花费 转移策略: 一, DP(I,J) = Min { DP(I+1,J)+cost(i), ... 阅读全文
posted @ 2013-01-13 13:50 yefeng1627 阅读(167) 评论(0) 推荐(0)
摘要:一, 将C个顶点排序后枚举两点构成直线,然后求最值. ( 排序后枚举,可减少重复枚举 ) 二, 我们枚举两点 (i, j ) ,因为我们排序后 (Xi,Yi)都比(Xj,Yj)都小,我们假定 Point(i) 作为跳进稻田路径的第一个点,这样,我们在之后枚举到相同路径的顶点时,就无需重复计算。 三,跳跃距离(dx,dy)向量相同,我们用 bool vis[5000][5000] 来标记合法点,当未跳出稻田且该点不合法则结束。解题代码:View Code #include<stdio.h>#include<string.h>#include<stdlib.h> 阅读全文
posted @ 2013-01-12 22:25 yefeng1627 阅读(240) 评论(0) 推荐(0)
摘要:将方差公式转换 : 方差: 均值: 得到: 我们知道 均值 X 为定值,与如何划分无关, 所以上述公式, 仅与 有关. 那么我们可以通过求出最优的, 即可求出最优 方差值. 因为对于任意矩形,我们可以通过 其左上角,右下角 坐标来唯一确定,且要保证结果无后效性,我们增加一维切割次数N 定义状态 DP(N,X1,Y1,X2,Y2) 为将 矩形(X1,Y1,X2,Y2)划分N次 的最小 平方值和 则根据题目得到 对于当前状态 DP(K,X1,Y1,X2,Y2) 对于 矩形 (X1,Y1,X2,Y2) ,依据题目要求只可在边缘切割,所以我们的切割方案分... 阅读全文
posted @ 2013-01-12 16:58 yefeng1627 阅读(258) 评论(0) 推荐(0)
摘要:状态 dp( i, j ) 表示 拿出i块巧克力,桌面上剩余j块的概率 若再拿出一块巧克力,则可能出现两种情况 一,一种是,从 桌面已出现的 J 种取 一种,然后被吃掉,则桌面总数量减少1,得到状态 dp(I+1,J-1),概率为 DP(I,J)*J/C, 二,一种是,从 桌面上未出现的C-J种取 一种,然后桌面数量增加一个,得到状态DP(I+1,J+1),概率为DP(I,J)*(C-J)/C 注意到 第一种情形出现的条件是 J-1 >= 0 ,第二种出现条件为 J+1 <= C 另外,我们知道当 M 》 C ,以及 M,N奇偶性不同时,概率必定为0. 至于N = 1e... 阅读全文
posted @ 2013-01-11 22:14 yefeng1627 阅读(355) 评论(0) 推荐(0)
摘要:神状态题。。。。经波神,旭神轮番普渡,方AC。。。道路崎岖啊。。。 状态 dp( i, j ) 此题状态意义,要能区分重复。 i 个苹果,使用 j 个盘子放置,不同方案数量。 状态转移方程,从 当前是否有盘子空 来区分,这样就不会存在重复情况了。 一,若存在空盘子,则可能分为1,2,3,。。。,J个, 但是状态 dp( i, j-1 ) J-1个盘子放置i个苹果,包含了2,3,。。,J-1个空的情况,所以此时等价于 dp( i, j-1 ) 二,若不存在空盘子,(此时要满足条件 i >= j ) , 那么 每一个盘子放一个苹果后,剩下 I - J 个苹果 放置在 J ... 阅读全文
posted @ 2013-01-11 20:37 yefeng1627 阅读(233) 评论(0) 推荐(0)
摘要:依据题目要求,则任意满足要求的N有如下关系 , 其中 ( x, y, z ) 为自然数 那么我们需要前1500个. 则可以通过枚举 x, y, z 来得出. 问题就转换成了如何枚举 x, y, z 使其不重复,且按照从小到大的顺序得出. 假定,我们已经求得了第 Ai 个 Ugly Number 那么, Ai*2,Ai*3,Ai*5 也必定是 Ugly Number, 这也确实是这样.但是我们想要知道的是其顺序大小关系. 第i个Ugly Number 为Ai, i+1个Ugly Number该如何求呢. 它必定是前面已求得的一个数 Aj, 通过 *2, *3, *5 ... 阅读全文
posted @ 2013-01-11 18:43 yefeng1627 阅读(178) 评论(0) 推荐(0)
摘要:题目题意异常恶心,难以理解...... 呵呵.....不过题意是 Lyush大神 花费一小时看明白后透露给笔者的, 到现在依然YM此大婶当中...... 先说说题目大意: 一颗完全二叉树,有 N ( n <= 1024,且必定为2的整数幂,意味着是一颗完全二叉树 ) 个叶子节点,每一个节点都含有一个长度为 LL ( L <= 1000 ) 的串 ( 串仅由大写字母构成), 现仅仅知道N个叶子节点串的组成.其他节点串不知道. 但我们知道,直接父节点相同的两个子节点,其对应位置不同则花费为1. 整棵树花费最小. 让你求,整棵树的最小花费, 以及根节点的可能串元素... 阅读全文
posted @ 2013-01-11 17:04 yefeng1627 阅读(346) 评论(1) 推荐(0)
摘要:解决此类问题常见思路: 为求以 A1, A2, ... , AK 为前K项的所有栏杆字典排序第K小的序列. 这里给出其他牛人的介绍先抛开此题,用最简单的全排列问题来说明这种方法。如1,2,3,4的全排列,共有4!种,求第10个的排列是?先试首位是1,后234有3!=6种<10,说明1偏小,转化成以2开头的第(10-6=4)个排列,而3!=6 >= 4,说明首位恰是2。第二位先试1(1没用过),后面2!=2个<4,1偏小,换成3(2用过了)为第二位,总编号也再减去2!,剩下2了。而此时2!>=2,说明第二位恰好是3。第三位先试1,但后面1!<2,因此改用4。末位则是 阅读全文
posted @ 2013-01-10 18:48 yefeng1627 阅读(173) 评论(0) 推荐(0)
摘要:状态 dp[i][j] 表示 第i根柱子,高度为j的最小花费 转移方程 dp( i , j ) = Min { dp( i-1, k ) + | k - j | * C + ( j-a[i] )*( j-a[i]) } 如果我们 枚举 j 和 k, 因为 都小于 100, 时间复杂度也有 O( 10^9 ), 1000 ms也不够. 我们可以把绝对值拆分开来: 当 j >= k 时: dp( i, j ) = Min{ dp( i-1, k ) - k*C + j*c + ( j-a[i])^2 } 当 j <= k 时: dp( i, j ) = ... 阅读全文
posted @ 2013-01-09 18:55 yefeng1627 阅读(221) 评论(0) 推荐(1)
摘要:将题目转换题意, 有一个M列的墙, 我们需要 使用 1*2 的小矩形 砌成N层高, 有多少不同的方案数量. 因为只有1*2的砖头, 且只有竖立或者横着放. 那么我们规定 竖立放置的砖头属于 较高的一层, 且 当前点放置砖头则为1,否则为0 那么我们可以得出结论: 对于 I 层 状态 X , 若当前位置为0,则下层必定为1. 则意味着下层必定包含 t = (~X)& Mask 对于 I+1 层 状态 Y, 除了包含 状态 t 之外, 剩下标记为1的 必须两两成对.才可符合状态. 注意 t = (~X)& Mask 这里要记得还要与 总集合MASK相与. 把状态限定在MASK... 阅读全文
posted @ 2013-01-09 12:07 yefeng1627 阅读(231) 评论(0) 推荐(0)
摘要:设定状态 DP( i, j ) 表示从第一层到 i 层 j 房间 最小花费. 则状态转移方程为 DP( i, j ) = Max { DP( i-1,j), DP( i, j-1 ), DP( i, j+1 ) } + a( i , j ) 因为 对于当前层的处理, 左右之间可以拆分开来处理, 再设定一个 d( i, j ) 记忆是由哪个位置走到当前位置的. 然后通过递归求路径即可解题代码View Code #include<stdio.h>#include<string.h>#include<stdlib.h>typedef long long LL;#d 阅读全文
posted @ 2013-01-08 22:12 yefeng1627 阅读(222) 评论(0) 推荐(0)

Launch CodeCogs Equation Editor