
动态规划---------------------
Toooooocold
这个作者很懒,什么都没留下…
展开
-
Codeforces 311B Cats Transport
第一次用斜率优化DP用双端队列维护前一次的dp值。代码:#includeusing namespace std;typedef long long ll;typedef pair PII;const int N = 1e5+5;ll sum[N]{0}, a[N], dp[N], f[N];int Q[N];int main() { int n, m原创 2017-05-05 23:46:33 · 552 阅读 · 0 评论 -
【差分+DP】Gym101620K Kitchen Knobs
Souce:Souce:Souce:2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17)Problem:Problem:Problem:n=500n=500n=500个长度为7的整数。需要把每个整数都变成最大循环表示,每次操作可以使连续的一段整数循环移动k位(往左/往右),求最少操作。Idea:Idea:Idea:除去每...原创 2018-10-04 23:03:13 · 419 阅读 · 0 评论 -
【树形DP】Gym101667A Broadcast Stations
Souce:2017-2018 ACM-ICPC, Asia Daejeon Regional ContestProblem:一棵5e3的树,可以选择一些点放上基站,如果u上的基站价值为d,那么距离u小于等于d的点都会被覆盖,问使得整棵树被覆盖的最小价值。Idea:g[u][j]g[u][j]g[u][j]表示u点这颗子树里距离u点大于j的点都被覆盖的最小价值。显然g[u][j]=∑g[...原创 2018-12-04 21:25:15 · 623 阅读 · 1 评论 -
【DP】Gym101933A Altruistic Amphibians
Source:Source:Source:2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)Problem:Problem:Problem:坑里有一堆青蛙,青蛙有身高、跳跃高度、体重。青蛙可以叠罗汉,但是不可以撑起超过自己体重的重量。问有多少青蛙可以跳出去。体重总和<=1e8Idea:Idea:Idea...原创 2018-10-27 03:08:29 · 660 阅读 · 1 评论 -
UVALive 5811 Cards
题意:扑克牌洗牌后一张一张发牌,对应的花色放成一堆,大小王可以放在任意堆,当四堆花色每堆的牌数都超过了给定的值就停止发牌,问发牌数的期望值。想到期望dp的话就可以用记忆化搜索做,停止发牌时的返回的期望是0。原创 2017-09-13 00:13:04 · 209 阅读 · 0 评论 -
POJ 1991 Turning in Homework
Source:POJ 1991 && 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛Problem:POJ的原题,大意是一条路上有n个点,每个点的物品刷新出来的时间不同,问把每个物品都拾取后再走到K点所需要的最短时间。Idea: 注意到对于每一段区间,先拾取两端的点优于先拾取中间的点,因为从一端走向另一端必定会经过中间的点。原创 2017-09-15 15:00:13 · 333 阅读 · 0 评论 -
HDU 6199 gems gems gems
Problem:给你n个不同价值的宝石,排成一排,两个人轮流拿,若前者拿了k个,后者只能拿k或k+1个,第一个人最开始只能拿1个或2个,他要使两人之差最大,第二个人要使两人之差最小,两个人都是最优的拿法,问其结果。Idea: DP。原创 2017-09-13 17:00:56 · 349 阅读 · 0 评论 -
UVALive 5063 Just Sum It
题意: 给你1~9这9个数字每个数字的最多选择个数,问他们所有不同的选择排列构造出的整数的整数和。思路: 用背包和组合数可以很容易得到任意情况的方案数,剩下的是考虑怎么求出每个数字对于答案的贡献。 假设数字aa有xx个,求出含有a≤x−1a\le x-1的所有方案数,再将最后一个aa插入。对于每一种方案有长度ll,枚举l+1l+1种插法,就可以得到aa出现过的所有位置了。原创 2017-08-27 14:55:12 · 194 阅读 · 0 评论 -
HDU 6129 Just do it
dp(i, j)表示第i次变换第j列的数。 dp(i, j) = dp(i, j-1)^dp(i-1, j) = dp(i, j-2)^dp(i-1, j-1)^dp(i-1, j-1)^dp(i-2, j) = dp(i, j-2)^dp(i-2, j) => dp(i, j-2^n)^dp(i-2^n, j) 从m中的最高位或最低位开始递推。原创 2017-08-16 01:06:37 · 969 阅读 · 3 评论 -
HDU 6161 Big binary tree
学了波标程。 每次修改从下往上更新dp值,dp值用贪心维护:如果左右儿子有被修改过,则返回其dp值,否则往下log(n)走到底,尽量选择靠右的点。 每次查询从下往上更新答案就可以枚举所有情况了。原创 2017-08-22 23:52:34 · 681 阅读 · 3 评论 -
Codeforces 55D Beautiful numbers
数位DP#includeusing namespace std;const int MAXN = 48;const int MOD = 2520;typedef __int64 ll;ll dp[20][MOD+5][MAXN];int a[20], h[MAXN];void ini() { memset(dp, -1, sizeof(dp)); in原创 2017-02-03 14:36:59 · 247 阅读 · 0 评论 -
Codeforces 461B Appleman and Tree
树形DPdp[i][0]表示不包括i的联通快没有黑点的方案数dp[i][1]表示不包括i的联通块有黑点的方案数这样对于树根i,每一个插进来的子叶j,都可以判断dp[j][0]和dp[j][1]对于dp[i][0]和dp[i][1]的贡献列如两个联通块都有黑点,那么这条相连的边就要割掉代码:#include#define pb push_back#define f原创 2017-04-27 11:39:25 · 372 阅读 · 0 评论 -
UVALive 4945 Free Goodies
背包。将物品按照petra的贪心思想排序假设Jan先手,对于第i (1~n)个物品,他的背包大小为(i+1)/2,因为对于前i个物品,Jan最多拿走(i+1) /2个。那么petra的值就是Jan拿剩下的。代码:#include#define fi first#define se second#define pb push_back#define lson o<<1#原创 2017-07-11 16:36:21 · 248 阅读 · 0 评论 -
HDU 6078 Wavel Sequence
类似于最长公共上升子序列,对于每个i,只考虑存在j使得a[i]==b[j]的情况。 dp[i][j][0]表示以a[i]和b[j]为公共序列结尾且为波谷的情况总和。 dp[i][j][1]则表示波峰的情况总和。原创 2017-08-03 22:42:22 · 1127 阅读 · 2 评论 -
UVALive 6575 Odd and Even Zeroes
n!中有几个0等价于1~n中有min(因子2的个数,因子5的个数),因为因子2的个数必大于因子5的个数,ans为n/5+n/25+n/125… 将n转为5进制,假设n为1234,那么ans为(123+12+1|五进制)。此时要判断ans是否为偶数。 注意到如果一个数x为偶数进制,列如十进制,那么只要判断最后一个数是否是偶数即可,因为其他位的数都是乘以10的幂次,乘积皆为偶数,只有最后一位是乘以1原创 2017-08-04 00:42:23 · 372 阅读 · 0 评论 -
HDU 6085 Rikka with Candies
因为题目要求答案mod 2,所以类似CS Academy #32的Light Count,将5e4的空间压缩成大概800份,每份空间用64位ULL状压。对于每个qk,求得多少对ai % bj = qk, 即ai = bj*x+qk && qk<=bj-1.将q数组和b数组从大到小排序后,枚举qk,如果存在还未使用过的bj>qk,那么类似于素数筛,将0, bj, 2*bj, 3*bj...异或进d数组,如果大于q原创 2017-08-08 22:01:15 · 229 阅读 · 0 评论 -
HDU 6125 Free from square
由于对于一个合法的答案,sqrt(500)后的素数最多只会用到一个,所以只对前8个素数状压后01背包。 dp(S, k)表示素数状态为S时由k个自然数组成的方法有几种。 再对后面的素数分别01背包。原创 2017-08-18 22:09:08 · 462 阅读 · 0 评论 -
Codeforces 360B Levko and Array
刷了好多DP了...结果还是想不到怎么做...二分beauty值,判断合法时dp[i]表示从i+1到n-1需要的最小变换次数,则当abs(a[i]-a[j]) 代码:#includeusing namespace std;typedef long long ll;const int N = 2e3+5;int n, k, dp[N], a[N];bool chec原创 2017-04-27 11:34:55 · 387 阅读 · 0 评论 -
【DP】Gym100524E Ebola Virus
Souce:2014-2015 Summer Petrozavodsk Camp, Andrew Stankevich Contest 46 (ASC 46)Problem:n个村庄,如果第i个村庄没有被治疗,每天会死掉a[i]个人。现在起始在第一个村庄,每次选择花费一天的时间 往前走/往后走/治疗当前村庄,使得总共死去的人数最少。但行动有个限制,如果你的前进方向上有一个曾经被路过但没有被治...原创 2018-12-07 18:43:30 · 380 阅读 · 0 评论