随笔分类 - 动态规划
摘要:代码来自 《算法竞赛进阶指南》,品一品。 重点:试除法。 #pragma warning(disable:4996) #include<iostream> #include<algorithm> #include<bitset> #include<tuple> #include<unordered_
阅读全文
摘要:给定一个1*n的地图,在里面玩2048,每次可以合并相邻两个(数值范围1-40),问最大能合出多少。注意合并后的数值并非加倍而是+1,例如2与2合并后的数值为3。 1.首先合并联想到区间,因此此题就是石子合并的变种 2.石子合并的条件是相邻,此题的条件是相邻且相等。注意是能“合并“出多少。 于是状态
阅读全文
摘要:区间DP是线性DP的一种,它以“区间长度”作为DP的“阶段”,使两个坐标(区间的左右端点)描述每个维度。 区间DP中,一个状态由若干个比它更小且包含于它的区间所代表的状态转移而来。区间DP的初态一般就由长度为1的“元区间”组成。这种向下划分,再向上递推的模式与某些树形结构如线段树有很大的相似之处。
阅读全文
摘要:按横坐标增序给n个点,问从最左点走到最右点,再从最右点走到最左点的最小路程。 对此题进行转化:有两个人从最左点出发,终点是最右点。问两人怎样决策可以使得总路程最小。 不妨设 i > j dp[i][j]表示一个人在i号点,另一个人在j号点,走到终点的最小路程。 对于下一个点,总有一个人要进行选择。
阅读全文
摘要:贝西有权选择让哪些奶牛参加展览。由于负的智商或情商会造成负面效果,所以贝西不希望出展奶牛的智商之和小于零,或情商之和小于零。 满足这两个条件下,她希望出展奶牛的智商与情商之和越大越好,请帮助贝西求出这个最大值。 • 第一行:单个整数N,1 ≤ N ≤ 400 • 第二行到第N + 1 行:第i +
阅读全文
摘要:据传这类问题叫做有依赖性的背包问题:选某个物品的同时必须连带选其他物品 容易想到其实是决策发生了变化: 可以选啥都不选 可以只选主件 可以选主件+一个附件 可以选主件+两个附件 其他和01背包一样 struct Bag { int w; int val; Bag(int x = 0,int y =
阅读全文
摘要:混合背包是指很多种背包一起做。此题属于多重背包的模板题 思想是统统转化为01背包 题目中有01背包(p = 1),完全背包(p = 0) , 多重哦背包 (p = k) 完全背包,只需将p = t / w 。 多重背包,只需进行二进制拆分 注意数组开大 int readint() { int x =
阅读全文
摘要:给定一个长度为n的正数组,在这个数组上跑,每跑到一个点获得该点的分数。 有k次行动的机会,有最多z次返回的机会。且返回不得连续返回两次。 k <= n - 1, 1 <= z <= min(5,k) 首先此题背景和《乌龟棋》很相似,其次z的范围很小,可以考虑dp dp[k][z]表示当前走了k步,返
阅读全文
摘要:第i个位置的分数是 a[i]。 每次可使用一张卡牌移动一定距离,每到一个位置可以加一次分数 问到终点的最大分数。 由于每张卡牌上限不超过40,考虑将状态设置为当前该种卡使用的卡牌数。 DP[a][b][c][d]表示使用a张1号牌,b张2号牌,c张3号牌,d张4号牌的情况下能够得到的最大分数。 考虑
阅读全文
摘要:https://www.luogu.com.cn/problem/P1095 状态dp[i]表示i时刻只用魔法的最远距离。 对于跑步,只需要利用处理好的dp维护一下。 其正确性基于贪心策略,长远的考虑,一定是用魔法的距离比跑步好,但是在个别情况,休息的过程时就有可能不如跑步,因此加入跑步来动态维护,
阅读全文
摘要:给出N个正整数,要求选出一些数组成等差数列。 问最长的等差数列的长度是多少。 3 <= N <= 10000 2<= Ai <= 1e9 容易想到用DP的方法。 dp[i][j]表示以j为中间的项拓展的最大的等差数列长度。 因此可以用双指针拓展,复杂度N*N。这里用short存储可以避免MLE #p
阅读全文
摘要:DFS套路。 cur , x , f , g 分别表示 进行到第cur位,前缀数字是x,f表示是否满数字,g代表是否含前导0 #include<iostream> #include<algorithm> #include<bitset> #include<tuple> #include<unorde
阅读全文
摘要:有n个盒子,每个盒子里面有一个披萨,现在进行m次放回的等概率拿取,若某一次拿到的盒子里有披萨就拿走披萨,但是空盒子仍然放回,问最后拿到披萨数目的期望数 由于正向考虑需要计算放回 ,故反向考虑 。 对于每个盒子而言,m次操作不被选中的概率是 (1 - 1/ n ) ^ m ,对于每个盒子而言,m次操作
阅读全文
摘要:目标到达n,每次可以选择 *2,*3,或者 +1 问最少步数。 Solution 1 : 裸的的BFS ,可惜若对T组数据每次都memset会超时。 考虑离线做法。直接BFS出所有结点,存入答案。 #include<bits/stdc++.h> using namespace std; const
阅读全文
摘要:你在起点面对n扇门,每次等概率的选择一扇门,若这扇门是数字,花费Xi直接到达终点否则花费Xi回到起点。 这题很有思考价值。 设期望时间为E。 有E = 1/n * (Xi ) + 1/n * (E + Xi) 最后求解E即可。 ll gcd(ll a, ll b) { return b == 0 ?
阅读全文
摘要:给出一个整数N 每次可以在不超过N的素数中随机选择以个P, 如果P是N的约数,则把N变成N/P ,否则N不变 。 问平均状况下需要多少次随机选择才能把N变为1 ? N<=1e6 int prime[maxn]; int vis[maxn]; double f[maxn]; int euler_sie
阅读全文
摘要:有k只麻球,每只活一天就会死亡临死前可能产生新的麻球。产生i个麻球的概率为P(i) 。给定m,问m天后所有麻球均死亡的概率。不足m天时全死亡的情况也算在内。 对此类概率问题。应掌握一定的套路。 由于每只麻球独立存活,只需求出一开始1只麻球,m天后全部死亡的概率为f(m) 。由全概率公式 f(i) =
阅读全文
摘要:给出n-1 个ai,i = 2 ~ n ,可以认为a1 = 1~n-1 问对每个i,输出最后y的大小 。 其中操作循环为 1. x+a[x] , y+ a[x] 2. x- a[x] , y+a[x] 。 退出条件为x>n 或 x<0 明显是记忆化搜素, 需要记忆操作的方向 。可以借助y每次总是+a
阅读全文
摘要:题意:给出N个物品及每次获得第i个物品的概率 问获得所有物品的次数的期望、 从简单考虑 若只有一个物品 获得一个物品的期望是1/p (1/p * p = 1) 这样可以推理得到 E1 = 1 / p1 , E2 = 1/ p2 , E12 = 1 / (p1+p2) (即获得第一个物品或第二个物品的
阅读全文
摘要:紫书中给出的解法是分块,非常重要的思想, 但是网上题解给出的更加简单DFS ,统计每位数对答案的贡献即可。 注意边界 具体见代码 #include<iostream> #include<string> #include<cmath> #include<cstring> #include<vector
阅读全文

浙公网安备 33010602011771号