DP--------------------
文章平均质量分 58
Spylft
这个作者很懒,什么都没留下…
展开
-
BZOJ 3437 小P的牧场
首先想到dp,我们定义dp[i]为在i造一个控制站,以及之前的最小消费. 所以有dp[i]=min(dp[j-1]+∑k=jib[k]∗(i−k)\sum_{k=j}^{i}b[k]*(i-k))+a[i]. 朴素的方法是O(N2N^2)的. 这显然过不了.所以我们去观察对于一个i,以及j,k这两种决策. 如果k比j优,则有dp[j−1]−dp[k−1]+∑l=jk−1b[l]∗(i−l)>原创 2016-09-11 13:57:48 · 389 阅读 · 0 评论 -
USACO2014Open Silver Odometer
Task: Farmer John’s cows are on a road trip! The odometer on their car displays an integer mileage value, starting at X (100 <= X <= 10^18) miles at the beginning of their trip and ending at原创 2016-09-19 14:20:14 · 859 阅读 · 0 评论 -
USACO2014Open Gold Code Breaking
Task: The cows keep getting in trouble by taking rides on Farmer John’s tractor, so he has hidden the keys to the tractor in a fancy new safe in his office. Undeterred, the cows have vowed to原创 2016-09-19 14:37:39 · 915 阅读 · 0 评论 -
Codeforces Round 371 C Sonya and Problem Wihtout a Legend
Task: 给你一个长度为n的序列,每次操作能使序列中的数+1或-1,求最少的操作数,使得序列严格递增. Sample Input 5 5 4 3 2 1 Sample Output 12 Hint 1<=n<=3000Solution: 首先我们先明白一件事:我们有A[i]<A[i+1]A[i]<A[i+1],也就可以转化为A[i]−i<=A[i原创 2016-09-20 13:26:43 · 598 阅读 · 0 评论 -
Codeforces Round #376 (Div. 2)
这次还好吧,总算进紫名了(25分比了3场才加上去...也是可以),而且还在这个晚上写完了所有题. 话说这次也太水了,F题和它的难度不成正比,所有题的代码都短的可以,除了WA了两次的D题. E题没看太亏了,几乎一模一样的题都做过… 好了好了开始讲题目… A:Night at the Museum Task: 给你一个转盘,以及一个字符串,一开始的转盘指向’a’,然后求若要输出此字原创 2016-10-17 07:44:17 · 629 阅读 · 5 评论 -
Topcoder SRM 701 Div2
Topcoder SRM 701 Div2话说终于又回到了Div1的坑里.上一把掉得太惨了啊…黄名掉到绿名…SquareFreeString这题还是很简单的吧(zqh被&和==的优先级坑了呢,重回灰名的他...).这道题就是在一个字符串中找一个子串,如果这个子串为两个相同的串拼接而成,那么这个串就被称为是not square-free,反之,它就是square-free.那么就随便搞搞就行了,枚举一原创 2016-10-27 18:49:04 · 733 阅读 · 0 评论 -
POI2014Criminals
这道题的话,首先是一个小贪心,枚举完在哪个点相遇之后,要得到这个点向左走多远才可以完成左边的序列,向右边走多远才可以完成右边的序列.这两个都取最小,然后再看一下两边之外的地方是不是有相同的元素,这样的话就差不多了.但是这样的话预处理比较麻烦.我的话是使用dp,dp[i]定义为现在这个点开始,是到达了需求序列中第i个点的最右边的开始位置.转移也是很扯淡…if(pl!=1)dp[pl]=dp[pl-1]原创 2016-11-07 22:32:04 · 418 阅读 · 0 评论 -
POI2014FarmCraft
大意: 就是给你一棵树,然后树上有n个节点,每条边的边权为1,然后每个节点有一个延时t,当你走过这个节点后,过了t时间之后,这个节点就被加入到已经经过的点的集合中,然后从1节点出发,在1节点结束,且1节点的计时只会在最后一次到1节点的时候开始. 求最少时间,能够经过所有的点.这道题的话,感觉就是一个状态定义出来后就只剩下码代码的树形dp了吧…那就开始定义状态.我们定义dp[i]原创 2016-11-08 16:36:01 · 611 阅读 · 0 评论 -
POI2014Little Bird
首先要想到dp,那么定义dp[i]为走到第i棵树时的最少劳累值.那么dp转移的时候就要考虑到两点之间的高度大小关系,所以要分类讨论.那么这样的dp就是O(n2)O(n^2)的了.所以考虑优化,因为我们发现一个点的dp值只可能够由它的前k个来转移,所以想到使用单调队列来优化dp.然后什么样的值才是最优的呢?首先dp值小的一定更优!因为dp值只能够一个一个地发生变化,所以无论高度差如何,只要dp值小1,原创 2016-11-08 19:24:16 · 540 阅读 · 0 评论 -
USACO 2006 Mar SkiLift
首先定义dp[i]为从1到i 最小的柱子数(i 也必须有柱子),我们还是用刷表法……(根本不会填表)dp[i] 可以刷到的区域为[i+1,i+l],而且也要满足题意,即缆线不能触碰山,即Hi与Hi+j连线不能与山接触,所以我们在向前for的同时记录现在需要的最小斜率(有坑),然后判断此时斜率是否大于这个斜率就好了.之前说斜率有坑是因为斜率的范围是[-1e9,1e9],然而又会有原创 2016-09-01 15:32:55 · 422 阅读 · 0 评论 -
USACO 2002 Feb CowCycling
定义dp[i][j][k]为还剩i头牛,跑了j圈,第k分钟,此时领头牛的最大电力,然后用刷表法dp[i][j][k]可以去转移dp[i][j+l][k+1],dp[i-1][j+l][k+1](l然后当j+l>=s时,输出i+1就行了#include#includeint dp[25][105][105];void check(int &x,int y){ i原创 2016-09-01 15:31:54 · 775 阅读 · 0 评论 -
SRM 570 DIV2 1000 CentaurCompany
Task给你一棵树,求在割去任意条边后,剩下的联通块的个数总和(全空也算是一个),也就是指那些使集内的点能只通过集内的点到达任意一个集内的点的点集.(点数<=50)Solution:我们把这个问题剖分成对于一棵树,在包含它的根时,有多少个这样的点集.那么在不包含它的情况可以递归下去求解. 那么只需要递归地求出儿子的解,然后在父亲上跑一个背包就好了.vector<int>edge[M];LL an原创 2016-09-13 16:29:16 · 448 阅读 · 0 评论 -
SRM 542 DIV1 500 StrangeDictionary2
Task:给你若干个字符串,然后给它们进行排序,但排序依照的位数是一个随机生成的排列(就是你可能对两个长度为三的字符串,先将它们的第2位进行比较,再比较第1位,再比较第3位才能得到它们的大小关系),那么求出每个字符串的期望排序后在第一位(最小)的可能性,(n<=16)Solution:这是一道状压dp题,我们定义dp[S][i]为当前剩下的集合为S,第i个元素可能是最小的可能性,那我们先预处理出如果原创 2016-09-13 16:33:22 · 362 阅读 · 0 评论 -
USACO 2009 Open SkiLessons
我们定义dp[i][j]为当能力为i,时间为j时滑过的最多的次数(也是个很显然的定义嘛)初值为dp[1][0]=0,然后对于每个时间,有上课,滑雪,看小说三个方法,相应的搞一下就好了.把课程捆起来放到vector里,滑雪的时间,我们可以得到一个在能力为i时,花的最少时间Ski[i](当然越少越好)就是以下代码了.#include#include#include原创 2016-09-01 16:15:38 · 296 阅读 · 0 评论 -
USACO 2009 Mar CowFrisbeeTeam
既然是求和为F的倍数的方案数,我们定义dp[i][j]为第j 头牛时和为i 的方案数,这是很基础的,我们又很容易得到若使i 模上F,答案并不会有区别,我们就将所有数模上F,同时得到的和也模上F,那么最多就只有1000种和的可能性[0,F-1].然后就是很平常的DP了.(这么简单的题目连Chongkan也写得出来吧……)#include#include#define M 2005原创 2016-09-01 15:34:23 · 436 阅读 · 0 评论 -
USACO 2009 Mar CleaningUp
首先我们可以想到O(N^2)的做法:由于dp方程为dp[i]=min(dp[j]+cost[i][j]) (cost[i][j]为i到j+1间不同的食物的数量的平方,可以在向前 for 时同时计算)然后我们可以看出,dp数组是递增的,那么在一段没有出现新元素的时候,一定取最前面的来转移.那么我们就存一个b,c, b[j] 表示使从i 开始前面颜色数而且当颜色数多于sqrt(原创 2016-09-01 15:30:36 · 506 阅读 · 0 评论 -
USACO 2009 Feb StockMarket
一只股票在A天买入,B天卖出,赚取C元.相当于在A天买入,A+1天卖出,再买入,再在后一天卖出......一直到B天.即可以对于一支股票只考虑它今天买入明天卖出的收益.那么我们定义dp[i]为这一天用i元钱可以得到的最大钱数,在每一天对每一件物品做一次完全背包,就能够得到那一天的dp数组.一天过后让m=dp[m],一直转移到最后一天就可以了.#includeint co[11][55],s,原创 2016-09-01 15:28:52 · 350 阅读 · 0 评论 -
USACO 2006 Dec TheFewestCoins
既然我们有了有的钱和张数,那么就可以预处理出到达每一个钱数的最小钱的张数(这里可以用二进制来优化,使复杂度从O(NCT)降到O(NTlogC)),然后再去处理老板的钱数所需最少张数(这里是一个完全背包,复杂度O(NT),那么答案就是min(dpC[k]+dpB[k-T]),(k>=T),总复杂度为O(NTlogC)#include#include#include#include#def原创 2016-09-01 15:27:26 · 513 阅读 · 0 评论 -
POI2014 Ant colony
很显然的一个想法就是通过有食蚁兽的那一条边把整棵树分成两棵树.这样就可以两边乱搞了对于一棵子树,我们现在存一下现在的上界r和下界l,遇到一个度为k的节点,分开之后它的上界和下界会变成[l∗k,(r+1)∗k−1][l*k,(r+1)*k-1].然后遇到叶子节点的时候,我们在原序列中询问[l,r][l,r]之间的数有多少个就行了,只用把原序列排个序,二分一下就行了.#include<cstdio>原创 2016-11-11 11:04:41 · 449 阅读 · 0 评论