摘要:
一个长度为 n 的序列,最少改变多少个数,使得其成为一个公差为 d 的等差序列。 题解:对于任意一个位置的数 a[ i ] ,如果这个数不变的话,那么所有与它相差 $k d$ 的数都不需要改变。因此,有等式$a[i] a[j]=d (i j)$成立时,这个数也不需要改变,左右移项整理得$a[i] i 阅读全文
摘要:
采用动态规划的原因:合并有一定次序,即:只能相邻石子进行合并。 阶段:当前合并了的区间长度 状态:区间的左右端点 状态转移方程:$dp[l][r]=min\{dp[l][r],dp[l][k]+dp[k+1][r]\},k\in[l,r)$ 代码如下 cpp include using namesp 阅读全文
摘要:
引理:当一个状态对应的节点第K次从堆中取出时,该状态对应的当前代价是从起点到该点的第K优解。 代码如下 阅读全文
摘要:
Dij的核心思想:全局最小值不会被其他节点更新,因此得到最小值后只需要扩展一次即可。 概念:扩展、出队 注意:vis[ ]数组表示的是每个节点是否扩展过,因此开始时vis[st]不置1。 时间复杂度$O(m*log(n))$ 代码如下: #include <bits/stdc++.h> using 阅读全文
摘要:
这是一道比较综合的动态规划问题。 首先,根据题目中的从N个人中选出M个人,并且要使得某个目标函数最优,可以想到是背包问题,且因为要取出M个人,人数也应该作为背包体积的一个维度。 其次,要求输出路径,因此不能进行滚动数组优化(优化后无法记录状态转移途径)。 再次观察要求最优的函数,是一个相减取绝对值的 阅读全文
摘要:
0 1背包问题的本质是一个 集合 中的每个物品都有 选和不选 两种情况 如:从一堆物品中选出 若干个 ,满足某些性质的问题 初始化需要注意的是开始时dp数组需要设置成为一个 相对于正解 来说不可能的解,可能是0,也可能是负无穷、正无穷,具体情况具体分析。 阶段:处理完了前 i 件物品 附加状态:当前 阅读全文
摘要:
对于搜索树分支很多且有明确起点和终点的情况时,可以采用双向搜索来减小搜索树的大小。 对于双向BFS来说,与单向最大的不同是双向BFS需要 按层扩展 ,表示可能到达的区域。而单向BFS则是按照单个节点进行扩展,因为只有当前状态。 代码如下: cpp include using namespace st 阅读全文
摘要:
普通BFS:每个状态只访问一次,第一次入队时即为该状态对应的最优解。 优先队列BFS:每个状态可能被更新多次,入队多次,但是只会扩展一次,每次出队时即为改状态对应的最优解。 且对于优先队列BFS来说,每次存入队列的不光是像普通BFS的状态,还有当前状态对应的代价,并且是依据最小代价进行扩展。每次状态 阅读全文
摘要:
题目大意:维护一个长度为 N 的序列,支持两种操作:区间修改、区间求和。N using namespace std; const int maxn=5e4+10; inline int read(){ int x=0,f=1;char ch; do{ch=getchar();if(ch==' ')f 阅读全文
摘要:
1. 通过邻项交换法可知,怨气值大的孩子分得的饼干数也应该多(否则交换之后得到的解更优)。 2. 观察目标函数的性质,可知目标函数本身是由孩子饼干数的相对大小得到,因此此题中关注的是相对大小。 状态设计:$dp[i][j]$表示前 i 个人分 j 个饼干的最小怨气值。(i,j)是问题的阶段 另外,在 阅读全文