dp优化
goto_1600
我何来寂寞,哪有寂寞可言。
展开
-
F2. Korney Korneevich and XOR (hard version)
link题意:给你长度为n的数组,n<=1e6,a[i]<=5000满足递增的子序列求出的值有哪些,求出具体方案。思路:正解是maxn^2的,我们从前往后遍历,由于会有很多重复的转移,我们考虑用一个ne数组代表多少个数能被x转移去重,g[x]数组代表以x为结尾,前面有多少个数能和x异或出来,由于ne数组是递减的,每次下降的时候要判断是否大于x,因为要判断是否是严格上升子序列,然后放到新的vector里面,用完以后记得把当前遍历完的清空。#include<bits/stdc++.h原创 2021-10-25 20:32:36 · 517 阅读 · 0 评论 -
树形dp 优化 ICPC南京 M.Monster Hunter
Link题意:有n个点形成一棵树,每个点的贡献是他自身的value和他目前存在的直系儿子的value之和,求依次求出删除0~n个节点的最小贡献。思路:考虑dp[i][j][k],到了i选了j个节点,当前这个节点删不删,那么显然很好转移,当父亲节点和该节点都是存活的情况下,会多额外贡献子节点的value.因为有了状态位,但是如果朴素转移会T,如下for(int i=siz[u]-;i>=0;i--){ for(int j=0;j<=min(i,siz[v]);j++)但是类似原创 2021-09-15 14:57:47 · 376 阅读 · 0 评论 -
2021 银川B DP
题意n个数分为要求分为1~n个子数组,每个子数组贡献为最大值减最小值n=1e4思路考虑dp ,dp[i][j][k]代表前i个数分为j个组,当前到了0/1/2/3状态,0代表最大数和最小数都没选,1代表选了最大数,2代表选了最小数,3代表俩数都选了,转移即可。由于8e8的空间,需要考虑滚动数组来优化。代码//#pragma GCC target("avx")//#pragma GCC optimize(2)//#pragma GCC optimize(3)//#pragma GCC opt原创 2021-08-15 21:30:49 · 275 阅读 · 2 评论 -
The Hard Work of Paparazzi(dp巧妙优化)
链接题意:r,n代表一个r * r的矩阵,n代表有n个金币,初始时间是0,现在你站在(1,1)位置,然后给出n个金币出现的位置(x,y)和出现的时间t,这个金币只在t这一分钟出现,过了t就消失,然后保证给出的t是严格递增的,求你能获得的最大收益。每分钟你能向四周移动一个单位。思路:dp[i]以第i个结尾的最大值,只想到on^2的做法,但后来发现因为r很小,t又是递增的,第二层循环只要枚举(i-4r~i-1)就行了,为什么呢,因为i-5r一定能更新i-3*r,那么如果枚举所有点,这样就多余了。复杂度O(.原创 2020-10-24 12:10:19 · 431 阅读 · 1 评论