
dp
nof_uck
人一我十,人百我万
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Codeforces Round #677 (Div. 3) F - Zero Remainder Sum()
题意给定 n∗mn*mn∗m 的矩阵,每一行可以最多可以选 m2\frac{m}{2}2m 个数,可以不选。要求选择的数的和为 kkk 的倍数,求和的最大值。思路范围都是 [1,70][1,70][1,70],很显然的一个dp,可以先对每一行跑一个dp,即dp[j][nn][k]表示前 jjj 个数选了 nnnnnn 个数,和的余数为 kkk 的和最大值。然后对于每一行,即就是一个分组背包,定义 dp2[i][k]dp2[i][k]dp2[i][k] 表示 前 iii 行余数和为 kkk 的和最原创 2020-11-06 17:17:02 · 198 阅读 · 0 评论 -
Educational Codeforces Round 93 (Rated for Div. 2) D. Colored Rectangles
一上来看完题目,这很贪心,马上写了发贪心,wa7!hack样例,当面临选择的数有两个相同,然后选择了某一个,可能后序的操作,得到的值不如选另一个数的价值大。1 2 2100 90 9090 301 2 2 10090 3090 90 所以正解该是dp,记录了每个状态的最优解。很容易想到状态 dp[i][j][z]dp[i][j][z]dp[i][j][z] 表示分别选择了 i,j,zi,j,zi,j,z 个棍子的最大价值。然后转移的话可以从 dp[i−1][j−1][z],dp[原创 2020-08-15 16:53:59 · 161 阅读 · 0 评论 -
P4124 [CQOI2016]手机号码(数位dp)
记录状态,pos当前位置,pre前一个数,ppre前前一个数,f是否有连续三个相等,f4是否出现4,f8是否出现8。记忆化这些变量,保证状态不冲突,对于长度,因为固定了11位,所以不用记录了。还有就是很坑的就是,虽然题目范围保证了数据都是11位,但如果当 l=1010l = 10^{10}l=1010 ,l-1就只有10位了,所以必须得特判。code#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;c原创 2020-07-14 16:54:53 · 280 阅读 · 0 评论 -
Educational Codeforces Round 74 (Rated for Div. 2) C. Standard Free2play (DP)
思路:对于2个点中间的所有点,其实都可以看做一个点(因为移动他们无需任何代价)那么我们把所有点的下一个点 x−1x-1x−1(不能为0) 放入集合,对这些点进行dp。定义dp[i]表示到达第 iii 个点都安全的最小代价。那么转移:如果下一个点是已经伸出的点:那么下一个点 dp[i+1] = min(dp[i+1],dp[i]+1) 因为改变这个点必会改变下一个点的状态,要让它保持不变,代价+1.下个点伸出,下下一个点如果是已经伸出的点,那么 dp[i+2] = min(dp[i+2],d原创 2020-07-09 15:33:04 · 211 阅读 · 0 评论 -
统计d(1~9)在数字0~n里面出现的个数(数位dp)
规律:首先枚举个位,十位,百位…,然后对于每一位,作为数字d的时候,包含的数字有多少个,分为这个数的左右2端。比如12345,要求d=4有多少个,对于十位,这一位取4,分成12300和45来看,对于12300,十位取4,其左边是有123种情况,右边有10种,所以总数就是1230,然后对于45,取4的情况有6种。然后对于百位也同样道理。code(以7为例)#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;原创 2020-06-14 22:39:04 · 641 阅读 · 0 评论 -
Codeforces Round #641 (Div. 2) Orac and Models最长上升子序列的变形
这题在最长上升子序列的基础上加上了一个限制条件,就是这个上升子序列的原数组下标当前能被前一个整除。思想还是 dp[i] 表示以 i 结尾的满足条件的最长上升子序列,普通的lst,dp[i]需要从1~ i - 1来得到更新,也可以理解成用1 ~i - 1的dp值来更新dp[i],那么对于这里,只需要枚举满足条件的下标去更新dp[i],即 i 这个下标的因子下标,用埃氏筛的思想。#pragma GCC optimize(2)#include<bits/stdc++.h>using names原创 2020-05-14 16:39:08 · 815 阅读 · 0 评论 -
bitset优化dp Music Problem
题意:就是给定n<=1e5n<=1e5n<=1e5个数,从中选取k个数,要求和是3600的倍数,T<=60组数据T<=60组数据T<=60组数据。①思路:dp[i]表示i这一位能被得到,然后更新就是从上一个能到达的状态更新过来,但复杂度无疑炸了。可以用bitset来优化,每次更新不用3600,而是直接移位(<<),然后在取个模(>>)...原创 2020-04-15 11:16:54 · 298 阅读 · 0 评论 -
状压dp(排列)
题意给你一串数字,长度为n(n<15),让你求所有排列中有多少个排列能整除d思路一个状压dp,dp[s][p]dp[s][p]dp[s][p]表示当前 状态s 的 mod d的余数为p,s的范围就是(0~(1<<15)-1)然后转移的话就是枚举当前状态没有的,然后加上该状态,更新到新状态。比如 11(2)11_{(2)}11(2)可以由01(2)01_{(2)}01...原创 2020-04-04 16:04:47 · 270 阅读 · 1 评论 -
HDU - 3466 01背包
正解是对q-p升序,然后跑个01背包。对于这题写下我的理解假设我们当没有q这个限制条件,其实就跟普通的01背包一样了,那么加上q这个限制 ,我们在01背包更新的时候会有一部分本该(没有限制条件的时候)更新,但在限制下没有被更新,我们拿2个物品来比较看看。代码就不贴了,网上很多。...原创 2020-03-25 19:31:02 · 192 阅读 · 0 评论 -
DP满足条件
无后效性最优化原理原创 2020-03-25 15:30:37 · 331 阅读 · 0 评论 -
cf1304 F2 Animal Observation (hard version)
题意:题目大意:给你一个n∗m的矩阵,你可以在每行放置一个2∗k的矩形框,问你被矩形框 ,框中的数的和最大值是多少。每个数只计算一次。思路:首先对于eazy版本(暴力)的求解方式。我们用dp[i][j]来记录状态,同时表示前i天在第j列收获的最大值。那么怎么更新它?把能覆盖区间[j,j+k-1]的区间和不覆盖的分开算。覆盖的我们在计算的时候就要把那部分给减去,那么覆盖[j,j+k-1...原创 2020-02-22 18:13:45 · 795 阅读 · 0 评论 -
树的直径+证明
概念树的直径:2点距离最远的路径。结论先说结论,对于一颗无根树,首先随便找一个点 u 开始进行搜索,找到离当前点最远的一点 s , 然后从 s 开始搜最远的点 t ,树的直径就为 s - t 。证明找到直径,我们只需找到直径2个端点其中的一个,然后找到离当前点最远的点即为另一个端点。1.首先u在s-t的路径上,很明显是对的,到达u最远的点必为s或t,因为是从u开始搜最远的点的。2.u...原创 2020-01-23 16:36:02 · 874 阅读 · 0 评论 -
( cf1249 )Codeforces Round #595 (Div. 3)部分题解
A Yet Another Dividing into Teams题意:n个不同的数,要对n个数进行分组,要求每组里面的任意差值的绝对值不能为1.为你组数.思路:很明显最多2组,找里面是否有2个差绝对值为1的,如果有就为2,没有就为 1.代码#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;...原创 2019-10-23 23:51:25 · 237 阅读 · 0 评论 -
有依赖的背包(供自己参考)
描述有依赖的背包最好理解的题就是NOIP的金明的预算方案,其每个物品有主件和附件,附件必须在主件已经购买了的请款下才能购买,这里牵扯到有依赖的背包的一个问题,将这些进行分组之后就有多种情况即:不能购买主件,只能购买主件,能购买主件和多个附件,这些情况组成了多个可能的情况。思路这里肯定会想到分组那里去,很显然的这一组的一些附件,肯定是在上一组的基础上更新过来,那么我们直接把上一组的所有状态一过...原创 2019-09-20 12:24:23 · 298 阅读 · 0 评论 -
HDU 6630 (2019 Multi-University Training Contest 5)
HDU6630 permutation 2题意给你n个位置,编号为1-n,其中第一个数给出为x,第n个位置的数为y,求满足以下条件的共有多少种填法。1,第一位必须是x,2,最后一位必须是y,3,相邻两位之差小于等于2思路如果就直接把初位置,末位置画出来,然后依次模拟填,无疑比较困难找,转换一下思考方式。我们把1到n的数想象成一个数轴,范围1到n。题目就变成了x到y经过左右移动1/2位有多...原创 2019-08-06 19:37:13 · 250 阅读 · 1 评论