DP
文章平均质量分 75
MoYingo
菜狗
展开
-
CCF22-4学校外的树(dp)
学校外的树题目给出n个点,选点,有的点被标记,无法选择,求方案数。选点规则如下:除头尾外的点,在其中选择任意数量的点,这些点分隔开的小区间彼此独立在划分出的小区间中,保证等差。思路考虑n=2n=2n=2的情况,能保证等分的方案数是左右端点的差的约数即为所求。考虑n>=2n>=2n>=2的情况,考虑到求的是方案数,优先考虑动态规划。我们试着给出dpdpdp定义为前i个点的方案数,显然dp[n]dp[n]dp[n]即为所求试着找出状态转移,将一个dp[n]dp[n原创 2021-09-15 22:52:07 · 102 阅读 · 0 评论 -
POJ2184 cow exhibition (01背包 dp + 偏移量)
Cow Exhibition题目奶牛想证明他们是聪明而风趣的。为此,贝西筹备了一个奶牛博览会,她已经对N头奶 牛进行了面试,确定了每头奶牛的智商和情商。 贝西有权选择让哪些奶牛参加展览。由于负的智商或情商会造成负面效果,所以贝西不 希望出展奶牛的智商之和小于零,或情商之和小于零。满足这两个条件下,她希望出展奶牛 的智商与情商之和越大越好,请帮助贝西求出这个最大值思路首先可以想到开一个三维数组,处理成一个01背包,但显然时间上不允许我们这样做。因为情商智商和的这个属性比较特殊,如果我们用原创 2021-09-11 11:16:05 · 147 阅读 · 0 评论 -
Space Elevator(多重背包求最大可行方案)
Space Elevator题目给n种砖,每种砖有最大高度限制mx,和数量限制x,求最大累计高度。思路这是一个完全背包求最大方案问题,可以说是求方案可行性的问题的一个子集。所以可以类比其定义dp定义dp[i][j]dp[i][j]dp[i][j]为考虑前i种物品,累加j时,第i种物品的剩余个数。状态转移,首先如果前i−1i-1i−1种已经可以拼出jjj,也即dp[i−1][j]!=−1dp[i-1][j]!=-1dp[i−1][j]!=−1。之后,如果还没有凑出j的方案,那么我们就要考原创 2021-09-08 11:34:22 · 184 阅读 · 0 评论 -
Making the Grade (dp)
Making the Grade 题目求构造一个单调不减或者单调不增的最小花费花费:把ai=>bia_i => b_iai=>bi的花费为 ∣ai−bi∣|a_i-b_i|∣ai−bi∣.思路这是一个求构造LIS的最小花费问题,优先选择动态规划。定义:dp[i][j]dp[i][j]dp[i][j]表示考虑前iii个数,把第iii个数改为bjb_jbj的最小花费。容易推出状态转移方程为dp[i−1][j]dp[i-1][j]dp[i−1][j]的最小花费加上这原创 2021-09-06 18:19:03 · 114 阅读 · 0 评论 -
Bridging signals(最长上升子序列)
Bridging signals 题目“哦,不,他们又做到了”,Waferland 芯片厂的首席设计师喊道。布线设计人员再次完全搞砸了,使连接两个功能块端口的芯片上的信号到处都是相互交叉的。在这个过程的后期阶段,重做路由的成本太高了。相反,工程师必须使用第三维来桥接信号,以免两个信号交叉。然而,桥接是一个复杂的操作,因此希望桥接尽可能少的信号。迫切需要一种计算机程序,以找到可以在硅表面上连接而不相互交叉的最大数量的信号。记住在功能块的边界处可能有数千个信号端口,这个问题对程序员提出了很多要求。你能胜任原创 2021-09-04 23:34:32 · 215 阅读 · 0 评论 -
Cheapest Palindrome(区间dp——最小花费回文串)
Cheapest Palindrome题目可以进行加入一个字符或删除一个字符的操作,它们都有对应代价,求这个最小代价思路明确对任意字符的插入或删除是等价的(在该位置删除 <==> 在对称位置加入)因此每个字符的花费就是取两操作花费的min。定义dp[i][j],表示[ i , j ] 上的子串是回文的可能集合,记录它的花费W寻找状态转移,可分两类1. 两端点字符相同,显然从 dp[i+1][j-1] 继承过来就行 , 增加花费为0。2. 两端点字符不同,则可以操作左右任意一原创 2021-09-03 18:01:27 · 288 阅读 · 0 评论 -
Dollar Dayz (完全背包 + 高精)
Dollar Dayz 题目有1-m个数,每个数不限量,问凑出n的方案数思路经典完全背包,不过要令写一个高精加法AC代码#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<cstring>#include<vector>#include<queue>#include<set>原创 2021-09-03 11:11:35 · 155 阅读 · 0 评论 -
Ant Counting(多重背包计数 + 优化)
Ant Counting题目t种蚂蚁,总共n只,从中挑出i只,求从中挑出l只到r只的所有挑法。思路显然是dp , 定义dp为从前i只挑出j只的方案集合,记录它的数量count。状态转移是从 dp[i-1][j-k] ==> dp[i][j]也即 : dp[i][j] = SUM(dp[i-1][j-k]) (0<=k<=min(该种蚂蚁最大个数,j)这是一个O(nmm)的算法(虽然这题数据挺水,也可以过)对于10^5数据量 ,需要优化到O(nm) 。回到dp原创 2021-09-03 10:35:50 · 340 阅读 · 0 评论 -
Coins(多重背包方案可行性dp + 优化)
Coins题目给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数。思路1.朴素的多重背包题面给出的很明显的多重背包,定义dp为考虑前i种硬币,能凑出j元的方案可行性,可以得到第一版代码O(nm^2) 代码#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<cstring>#include<vector&原创 2021-09-02 16:11:11 · 429 阅读 · 0 评论 -
Max Sum Plus Plus(DP + 最大子段和)
Max Sum Plus Plus题目link给一个长n的序列,分成m段,求最大子段和。(各个子段不重叠)思路很显然要用dp写。当以最右区间元素下标为标准 ,我们可以给出dp的朴素定义即dp[i][j] 表示只考虑[1,j]的序列并把序列分为i组,且最右子段右端为a[j]的最大和之后要么连接旧子段,要么开一个新子段:dp[i][j] = max ( dp[i][j-1] + a[j] , dp[i-1][k] +a[j])其中的 k 当 dp[i-1][k] 为最值时取到按这种写法原创 2021-08-17 00:15:46 · 722 阅读 · 0 评论