摘要:
整个寒假+3月份 都在开发OJ,好久没写题解了。第一题Non-negative Partial Sums 解法一: 预处理前缀和 sum[N] , 对于通用序列 ( a(i+1), a(i+2), ... a(n), a(1) ... a(i) ),将其分为 ( a(i+1) ... a(n) ), ( a(1)...a(i) )\两段, 此循环是以 a(i+1) 为起始的序列, 若其所有前缀和要满足条件,则 Min{ sum(1)...sum(i) } + sum(n)-sum(i+1) >= 0 MIN{ sum(i+1)...sum(n) } - sum(i) >= ... 阅读全文
摘要:
贴个官方解题报告Similarity of necklaces 2这个问题是一个012背包问题。我们知道01背包只要逆向线性检索,无限背包只要正向检索。012背包就是说,每个物品有一个数量上限。这个问题可以用log方法,也存在线性方法,需要维护一个递增/递减序列。我们先把所有的Table都放成下限,接下来我们可以算出它距离总和为0还需要增加多少。对于1<=i<=M,它可以看成这样一个物品:体积为Multi[i],费用为Pairs[i],数量为Up[i]-Low[i]。然后就得到一个012背包问题了。复杂度约为:O(M*背包大小)。其中背包大小不超过M*20*25=200*20*25 阅读全文
摘要:
大致思路是从根节点DFS下去后,处理完子树信息后,合并然后得出根节点信息,但是这一题子节点信息的合并确实比较棘手.如果我们尝试把从当前根节点走K步得到最大苹果数,划分为如下两种: go[t][i]代表节点t的所有子树上走i步不返回,取得的最大苹果数 bk[t][i]代表节点t的所有子树上走i步并返回,取得的最大苹果数 数组二维go,bkgo[t][i]代表节点t的所有子树上至多走i步不返回,取得的最大苹果数bk[t][i]代表节点t的所有子树上至多走i步并返回,取得的最大苹果数求节点为x,实行不断合并子树求最优值当前合并到了q棵子树:go[x][i]就是这q棵子树上至多走i步不返... 阅读全文
摘要:
对于一颗以 rt 为根的树,其有 I 个子节点分别为 S1,S2,。。。,SI ,则 状态 dp(i,j)表示前 1,2,,,,,I 子树,组合而成一棵 包含 J个节点的 子树的最小花费 sum(Si) 表示 以 Si 节点为根的子树,节点数量 Cut (Si, K) 表示 子树 Si 中取得 一棵包含 根Si 的子树 且节点数量为 K 的最小花费 则状态转移方程: 其中 x <= Sum(Si), 且 注意到, 其实我们已经把 子树S1,S2,,S(i-1) 合并到了 dp(I-1)里头去了。这样就简化了枚举计算。 另外,还可以注意到 ... 阅读全文
摘要:
1、如果田忌剩下的马中最强的马都赢不了齐王剩下的最强的马,那么应该用最差的一匹马去输给齐王最强的马。 2、如果田忌剩下的马中最强的马可以赢齐王剩下的最强的马,那就用这匹马去赢齐王剩下的最强的马。 3、如果田忌剩下的马中最强的马和齐王剩下的最强的马打平的话,可以选择打平或者用最差的马输掉比赛。 设表示齐王按从强到弱的顺序出马和田忌进行了i场比赛之后,从“头”取了j匹较强的马,从“尾”取了i-j匹较弱的马,所能够得到的最大盈利。 状态转移方程如下: 注意边界条件的判定View Code // Code by yefeng162... 阅读全文
摘要:
浅谈贪心思想在动态规划中的应用 -----黄劲松 论文中的例题,其中也附有详接 讲讲自己的理解吧. 题目所求为, 使用某种特定策略,使从根节点rt ,依次到每个叶子节点最少步长. 再除以叶子节点数量. 即为最终期望值. 对于一个以 rt 为根的子树上, 我们将其分为 House在子树rt上的步长总数Fa , 以及不在子树上步长总数Fb: 表示 House 在 该rt为根子树上的 步长总数 表示House 不在 该rt为根子树上的 步长总数 表示 该子树上 叶子节点数量 则所求期望为: 若节点 u, 有 k 个子节点, 按照 s1... 阅读全文
摘要:
我们把 放置在 第 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不同, 若当前位置为平原, 只影响当前层,而对下一层无影响,所以我们不能将 平原和高山 情况合并到状态中, 其实直接单点考虑也没事. ... 阅读全文
摘要:
把底边贴着第 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-... 阅读全文
摘要:
状态表示 前 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位, 我们可以映射到一个 阅读全文
摘要:
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 斜率不存在的特殊情... 阅读全文