各种dp题、
Yokile_
不知道
展开
-
codeforces 687C
题意:给你n个硬币,一个数k,n个硬币每个硬币都有一个价值Ci,问从这些硬币中组合成k的集合的子集合中又能组成多少个数、刚开始错误的解题思路:我开始以为只需要找到一种组合成k的方法的数然后用这个集合中的数再去找子集合,这个子集合当然使用01背包来做很简单、然而题意中是只要能组成k的集合都需要遍历一遍、贴上自己错误的代码#include#include#include#include原创 2016-08-30 17:19:45 · 380 阅读 · 0 评论 -
codeforces 597B
题意:给出每一个订单的时间,求出在时间不重叠的情况下,最多能接多少单、思路:排序贪心、,你想要不重叠的数量最多,那么肯定先结束的肯定要先做,水题了#include#include#include#include#includeusing namespace std;const int qq = 5e5+10;struct Seg{ int l,r; bool operat原创 2016-09-08 21:10:19 · 251 阅读 · 0 评论 -
codeforces 628B
题意:给出一个数字字符串,问有多少个子串能被4整除思路:分三种情况讨论,第一种子串长度为1的时候能被4乘除的,第二种子串长度为2的时候能被4乘除的,第三种子串长度大于2的时候能被4乘除的,首先第一种第二种都写,就是第三种,很简单比如一个数123 我们可以拆成 100 + 23 这是我们需要计算的就是 (100mod4 + 23mod4)mod 4 是不是等于0,其实我们也看的出来100mod4原创 2016-09-07 21:30:51 · 300 阅读 · 0 评论 -
codeforces 366C
题意:给出n,k 然后给出n个水果对应的taste和calories 要求选出一些水果 满足 ,在满足这个的情况下求sigma(a[j])的最大值、思路:令bi=ai-k×bi,就是sigma(b[i])=0,sigma(a[i])最大。把b[i]当体积,a[i]当价值,这样就形成了一个01背包、然后设置一个偏移量就好、#include#includ原创 2016-10-04 16:09:48 · 649 阅读 · 0 评论 -
51nod 1021
将n堆合并问题化为子问题n-1,n-2 , .... , 2dp[i][j]代表从i堆石子到j堆石子合并的最小代价那么dp[1][n]就是答案、状态转移方程 dp[i][j]=min(dp[i][j], dp[i][k]+dp[k+1][j]+sum[i][j]) i因为只能相邻的两个才能合并、#include#include#include#include#i原创 2016-09-18 21:51:10 · 465 阅读 · 0 评论 -
codeforces 615B
题意:给出n个点是m条无向边,假设一条链长度是p,且这条链上的点是严格递增的,链的末端端点为u,求出最大的degree[u]*p思路:dp[i]代表以i结尾的链的最大长度(不包括i本身),那么我们对点输入的时候辩证一下顺序,然后对起点进行排序,最后答案就是(dp[i]+1)*degree[i]#include#include#include#include#includeusin原创 2016-09-05 15:37:31 · 253 阅读 · 0 评论 -
codeforces 702B
题意:给出n个城镇,k对学校,k对学校分布在不同的城镇,然后给出2*k个学校所在城镇的编号,然后再给出n-1条边连接的两个城镇,保证每一个城镇都能到达任何一个其他城镇,2*k个学校可以任意配对,要求每一队配对的学校的距离总和最大,每一条边的距离是1思路:如果对于一个点而言,如果这些学校分布在这个点的左子树和右子树,那么我们可以求出这些学校到这个点的距离然后加起来就是结果,但是题目并不保证这个条原创 2016-09-04 21:33:57 · 297 阅读 · 0 评论 -
codeforces 671A
题意:给你两个人的位置和一个箱子的位置,然后给出n个瓶子的位置,要求让至少一个人去捡瓶子放到箱子里面去,一次只能拿一个瓶子,求把全部瓶子捡完之后的距离总和最小思路:仔细想想,如果一个人去捡了某个瓶子那么他之后肯定会走到箱子的位置上去,然后再去捡的话就是箱子到某个瓶子的距离,那么我们可以分这样三种情况考虑,人物A一个人捡完了所有的瓶子,人物B一个人捡完了所有瓶子,人物A捡了某个瓶子 人物B捡了原创 2016-09-03 17:05:40 · 341 阅读 · 0 评论 -
codeforces 580D
题意:有n道菜,每一道菜有一个满意值,现在要准确的吃m道菜,但是有k中吃菜顺序,如果先吃x再吃y满意值可以额外增加z,求出最大的满意值思路:dp+状压这题虽然很容易想到状压、但本弱弱开始想到的方法是C(n,m)先把m道菜先选出来 然后在对每一个结果进行排列组合,在算,想想时间复杂度.....C(n,m)就可以达到10的5次方,排列组合的复杂度.... 直接超了、借鉴了大牛的思路、感觉这原创 2016-09-13 20:15:41 · 701 阅读 · 0 评论 -
codeforces 710E
题意:给你一个文本,现在这个文本是空的,你有两种操作,一种是加入或者删除一个字符耗时间x,另外一种操作是对文本复制然后粘贴一份,比如原来有c个字符现在有2*c个字符,耗时间y,要你求生成n个字符的最小时间、思路:dp[i]代表生成i个字符的最小时间,那么如果i是奇数,那么i这个状态只能由增加一个字符和减少一个字符而来,即dp[i] = min(dp[i-1]+x, dp[i+1]+x),还有本原创 2016-09-01 19:02:44 · 334 阅读 · 0 评论 -
codeforces 459E
题意:给出一个有向图,要求找一个权值严格递增的最长路径,输出边的条数思路:如果没要求严格递增就是一道比较水的题直接按权值排个序,然后dp[v]=max(dp[v], dp[u]+1),然这里就是要求严格递增,那么关键问题还是在于处理权值相同的边,还是先按权值从小到大排一个序,然后把权值相同的统一拿出来更新,用dis更新u这个点,每次处理玩后就更新以某个点结束的最大路径、主要是理解为什么把权值相原创 2016-09-12 20:01:37 · 295 阅读 · 0 评论 -
codeforces 682C
这题真有意思、想了我好久好久,真为自己的智商捉急。。。,大牛们对这种思维真的是秒出题意:给出一棵树,有一种结点称为sad, 如果在v的子树中存在结点u 使得dis(v, u) > node[u],那么结点v就是sad结点,dis(v, u)代表从结点v出发到结点u的权值和,由题可知这棵树是一颗最小生成树(只有n-1条边),所以从一个结点到另一个结点的路径有且只有一条,可以用反证法证明,要求删去原创 2016-08-31 20:24:53 · 858 阅读 · 0 评论 -
背包专题、
背包资料:参考背包九讲HDU 2546思路:卡上的剩余金额大于或等于5元,就一定可以购买成功,注意这句话,那么我们考虑如果我们拿这最后五块钱去买最贵的东西的话肯定是可以的,但此时能选得物品不包括最贵的那一样,因为最贵的那一样我们会拿开始就拿出来的5块钱去买、那么问题就简化成了一个01背包#include#include#include#includeusing namespac原创 2016-08-31 06:48:42 · 267 阅读 · 0 评论