传送门 题意:给出一个nnn个数的序列,要求将序列分成若干段,对于一段长度为kkk的自动删去最小的⌊kc⌋\left \lfloor \frac{k}{c} \right \rfloor⌊ck​⌋个数,求删去之后剩下的数的和的最小值. 思路:显然每个被分开的段长不超过ccc时最优(不然会有其他更小的局部最小值来替代不够优),于是dpdpdp转移一下就行了: 当前这个位置跟之前的分在一起:fi=fi−1+aif_i=f_{i-1}+a_ifi​=fi−1​+ai​ 把当前靠右的ccc个位置分在一起…
传送门:CodeForces - 940E - Cashback 题意:在一个长度为n的数组中,可以分出长度为 k 连续的多个数组b(每个数组 b 的 k 可不相同),然后,可以对每个数组 b 进行删去 k / c 个数的操作: 输出最小的全部数组b的和: 思路:首先要贪心的想到,这个 k 要么等于 c ,要么等于 1 ,才能使总和最小: 所以列出递推方程:hh [ i -1 ] = min(hh[i - 1] + a[ i ]   , hh[ i - c]+sum[ i ] - sum[ i…
传送门 sb线性DP. f[i][j][0/1/2/3]f[i][j][0/1/2/3]f[i][j][0/1/2/3]表示前i列j个连通块且第i列状态为00/01/10/11时的方案总数. 这个显然可以轻松转移. 举例: f[i][j][0]=(f[i−1][j][0]+f[i−1][j][1]+f[i−1][j][2]+f[i−1][j−1][3])f[i][j][0]=(f[i-1][j][0]+f[i-1][j][1]+f[i-1][j][2]+f[i-1][j-1][3])%mod;f…
传送门 sbsbsb树形dpdpdp题. 题意简述:给出一棵边权为1的树,允许选任意一个点vvv为根,求∑i=1ndist(i,v)∗ai\sum_{i=1}^ndist(i,v)*a_i∑i=1n​dist(i,v)∗ai​的最大值. 直接统计出子树的权值和转移就行了. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; inline int read(){ int ans=0; char ch=g…
Description 题库链接 给你两个整数 \(n,c\) ,以及一个数列 \(A\) ,让你将序列分为许多段.对于每一段,他的价值为序列内除了最小的 \(\left\lfloor\frac{lenth}{c}\right\rfloor\) 个元素以外的其他所有元素和, \(lenth\) 为该段的长度.最小化这个价值和. \(1\leq n,c\leq 100000,1\leq A_i\leq 10^9\) Solution 一个由贪心得出的结论是整个序列只要分为若干个长度为 \(c\)…
D. Flowers time limit per test:1.5 seconds memory limit per test:256 megabytes We saw the little game Marmot made for Mole's lunch. Now it's Marmot's dinner time and, as we all know, Marmot eats flowers. At every dinner he eats some red and white flo…
<题目链接> 题目大意:给定一个序列,让你在其中挑选一些数,如果你选了x,那么你能够得到x分,但是该序列中所有等于x-1和x+1的元素将全部消失,问你最多能够得多少分. 解题分析:从小到大枚举选的数的数值,同时用DP进行状态的转移,$dp[i]$表示前 $i$ 的数值中,挑选$i$的最大得分. 所以不难得到dp的转移方程为:$$dp[i]=max(dp[i-1],dp[i-2]+num[i]*i)$$ #include <bits/stdc++.h> using namespace…
顺序对齐 题目描述 考虑两个字符串右对齐的最佳解法.例如,有一个右对齐方案中字符串是 AADDEFGGHC 和 ADCDEGH. AAD~DEFGGHC ADCDE~~GH~ 每一个数值匹配的位置值 2 分,一段连续的空格值 -1 分.所以总分是匹配点的 2 倍减去连续空格的段数,在上述给定的例子中,6 个位置 (A,D,D,E,G,H) 匹配,三段空格,所以得分 2*6+(-1)*3=9,注意,我们并不处罚左边的不匹配位置.若匹配的位置是两个不同的字符,则既不得分也不失分. 请你写个程序找出最…
传送门 •题意 给出一个长度为n的字符串s,对于每个$s_{i}$有$a_{i}$的价值 让你删除最小的价值,使得字符串中不存在$hard$这个子序列 •思路 设dp[1]是不存在以$h$为前缀的最小代价 dp[2]是不存在以$ha$为前缀,也就是不存在$h$或者不存在$a$或者不存在$ha$的最小代价 同理,dp[3]是不存在以$har$为前缀的最小代价,dp[4]是不存在以$hard$为前缀的最小代价 dp[i]可以有dp[i-1]转移来,$dp[i]=min(dp[i]+a,dp[i-1]…
传送门 线段树入门题. 给你一个序列:支持区间修改成自己的约数个数,区间求和. 实际上跟区间开方一个道理. 2的约数个数为2,1的约数个数为1,因此只要区间的最大值小于3就不用修改否则就暴力修改. 因此要做的就是预处理一个数的约数个数,这个可以nlnnnln_nnlnn​预处理. 代码: #include<bits/stdc++.h> #define lc (p<<1) #define rc (p<<1|1) #define mid (T[p].l+T[p].r>…