
dp
winhcc
这个作者很懒,什么都没留下…
展开
-
Codeforces 1133E
给n个数,选k段,每一段中最大的数和最小数之差不能大于5,问最多能选多少个数。先排序。dp[i][j]表示前i个数选j段能选的最大的个数,用upperbound()函数可以求出小于等于a[i] + 5的个数,考虑到下标为i时,有d[i+1+cnt][j] = max(dp[i+1+cnt][j],dp[i][]-1] + fr + 1);答案就是dp[n][k]#include<b...原创 2019-03-30 17:28:38 · 365 阅读 · 0 评论 -
Codeforces 1096D
给一个字符串,,需要移除一些字符,使得剩下的字符串中不存在“hard”子序列,移除一个字符会产生一定的花费,求最小的花费。首先肯定是移除同一种字符,不能既删‘h’,又删’a’。dp[i][j]表示考虑到第i个字符时选择移除"hard"中前j个字符的最小的花费则比如s[i] 是’a’ 时,需要考虑的是前i-1个移除‘h’和‘a’的费用,因为’r’和’d’对当前的’a’无影响,则dp[i][2]...原创 2019-03-30 22:16:00 · 246 阅读 · 0 评论 -
poj 3616
有m个区间,每个区间有st,end,eff三个变量,选中一个区间时后一个区间的st - 前一个区间的end要不小于R,让你选若干个区间使得所有的eff之和最大先把区间排序,dp[i]表示考虑到下标为i的区间时能获得的最大eff和,则 如果前面有区间j 的 end <= i的st - R的话,就可以转移,即dp[i] = max(dp[i],dp[j]+a[i].e);#include &...原创 2019-03-31 13:32:26 · 215 阅读 · 0 评论 -
hdu 1257
求一个序列的递减子序列的数量,问什么等同于求LIS呢?可以这样想,若i<j 且 a[i] < a[j] ,那么a[i]和a[j]肯定不在一个递减序列里面,则到j时候dp[j]至少是dp[i]+1,所以就是求原序列的LIS.n^2#include <cstdio>#include <algorithm> using namespace std;in...原创 2019-03-27 16:04:52 · 90 阅读 · 0 评论 -
hdu 5119
di,j表示前i个数获得异或为j的方案数,则di,j = di-1,j + di-1,j^a[i] .1e6 < 2 ^ 20, 故异或最大可以到2^20.有 40 个数,总共差不多4*10^7的空间,没必要滚动。#include <cstdio>#include <cstring>#include <algorithm>using na...原创 2019-03-27 16:55:36 · 170 阅读 · 0 评论 -
Codeforces 1061C
给一个序列,找一个子序列,使得子序列中第i位的数能整除i,问能找到多少个子序列。dp[i][j] 表示前i个数取得长度为j的子序列的个数则dp[i][j] = dp[i-1][j] + (dp[i-1][j-1] if( a[i] % j == 0))可知i只和i-1有关系,故可以滚动起来又 n 范围是1e5, n^2肯定TLE,进一步思考可知只有当a[i] %j == 0 时才需要更新,所...原创 2019-04-02 19:49:54 · 272 阅读 · 0 评论 -
Codeforces 1155D
给一个序列,可以将一个连续子序列的每个值都乘x,问这样操作以后能得到的最大连续子序列的值是多少.dp可搞,dp[i][0]表示到i时没有使用乘x操作能获得的最大连续子序列的值dp[i][0] = max(a[i],dp[i-1][0] + a[i])dp[i][1]表示到i时正处在在乘x的操作中能获得的最大连续子序列的值则dp[i][1] = max(dp[i][1],max(dp[i-1...原创 2019-05-08 19:13:03 · 203 阅读 · 0 评论