随笔分类 -  ACM_动态规划

摘要:通道题意:给n个点,现在要使这n个点连通,并且要求代价最小。现在有2个点之间不能直接连通(除了第一个点),求最小代价思路:先求mst,然后枚举边,对于生成树上的边替换,用树形dp O(N^2)求出每条生成树边的最小替代边。然后替换后的最大值代码:#include #include #include ... 阅读全文
posted @ 2015-08-10 23:34 mithrilhan 阅读(219) 评论(0) 推荐(0)
摘要:通道题意:给定n个点的树,问树的直径有多少条代码:#include#includeconst int N=500000;const int inf=0x3fffffff;int head[N],num,Len[N],ans,node[N],k;struct edge{ int ed,w,nex... 阅读全文
posted @ 2015-08-10 21:21 mithrilhan 阅读(142) 评论(0) 推荐(0)
摘要:通道题意:给一个树,边有颜色,点有权值。满足路径上没有两个相邻边同色的路径是好的路径,求好的路径的(路径上的点的权值和)的总和思路:边权排序,从任意一点开始深搜,每颗子树搜索完毕之后向上返回pair每次深搜完一个子节点之后,增加的过这一点的gorgeous边的总分数为: 之前深搜的所有子节点向上返回... 阅读全文
posted @ 2015-08-10 16:13 mithrilhan 阅读(203) 评论(0) 推荐(0)
摘要:通道题意:一棵树,求不经过路径的最小标号代码:#include #include #include #include #include #include #include using namespace std; #define maxn 1005000#define inf 0x3f3f3f3f ... 阅读全文
posted @ 2015-08-09 13:38 mithrilhan 阅读(280) 评论(0) 推荐(0)
摘要:通道题意:给出一棵树,根节点是1,要求根据以下要求选择最多的节点:①不能选择1②若选择当前节点,那么该节点的父节点和儿子都不能选择。③若某节点的某一个儿子节点被选择,那么该节点的其他儿子不能被选择样例分析图:思路:用dp[u][2]表示u节点是否被选择的最大值,则dp[u][1]=sum{dp[v]... 阅读全文
posted @ 2015-08-05 21:29 mithrilhan 阅读(201) 评论(0) 推荐(0)
摘要:通道题意:边权树,有m个点是危险的,现在想将树分成m块使得每块中恰好只有一个危险的点,问最小的花费是多少思路:dp[i][0|1以i节点为根节点的子树中,i所在的连通块中没有(有)危险节点的最小花费;如果i是叶子节点:如果i为危险点dp[i][0] = inf,dp[i][1]= 0;否则dp[i]... 阅读全文
posted @ 2015-08-05 21:05 mithrilhan 阅读(168) 评论(0) 推荐(0)
摘要:通道题意:一棵树上有K个黑色节点,剩余节点都为白色,将其划分成K个子树,使得每棵树上都只有1个黑色节点,共有多少种划分方案思路:dp[i][0]和dp[i][1]分别表示i子树所在联通块不存在黑节点和已经存在一个黑节点的方案数代码:#include#include#include#include#i... 阅读全文
posted @ 2015-08-05 20:17 mithrilhan 阅读(223) 评论(0) 推荐(0)
摘要:通道题意:给出一个字符串和一个k,将字符串分成k段,每段的求法是sigma【(i − P OS) ∗ P OS】,问如何分段使得总和最小思路:设dp[i][j] 为将前j个字符分成i段的最小值。a[i]为第i个字符在原始字符串的位置。那么dp[i][j] = min(dp[i][j],dp[i-1]... 阅读全文
posted @ 2015-08-03 13:03 mithrilhan 阅读(259) 评论(0) 推荐(0)
摘要:通道题意:一台机器要按照顺序完成n个任务,每个任务都有一个代价f和需要时间t。机器完成任务的方式是分批处理,对于每一批任务需要首先预处理s时间,同批任务中所有单个任务都是同时完成,代价为完成的时刻乘以各自的代价。求最小代价思路:分批考虑情况太多,可以先将问题转化。每个任务对对最后代价的贡献实际上等于... 阅读全文
posted @ 2015-08-02 16:35 mithrilhan 阅读(193) 评论(0) 推荐(0)
摘要:通道题意:用数轴描述一条高速公路,有N个村庄,每一个村庄坐落在数轴的某个点上,需要选择P个村庄在其中建立邮局,要求每个村庄到最近邮局的距离和最小思路:用f[i][j]表示建好i个邮局时覆盖到第j个村庄的最优解,那么就可以得到f[i][j]=min{f[i-1][k]+w[k+1][j]}(k#inc... 阅读全文
posted @ 2015-08-02 16:28 mithrilhan 阅读(163) 评论(0) 推荐(0)
摘要:通道题意:二维坐标上的点,建一个长度和最小的树包含全部点思路:定义状态 dp[i,j]表示点i到点j合并在一起的最小花费(树枝的长度),状态转移方程:dp[i,j]= min(dp[i,k]+dp[k+1,j]+cost(i,j) ) i #include #include #include... 阅读全文
posted @ 2015-08-02 15:46 mithrilhan 阅读(160) 评论(0) 推荐(0)
摘要:通道题意:有n个数,分段,每段长度至少为T,这段权值为全修改为最小数花费,求总花费最小思路:先对n个数进行排序,dp[i]表示前i个数得到的最少值,则:从j+1~i作为一组dp[i]=dp[j]+sum[i]-sum[j]-(i-j)*s[j+1];//sum[i]表示前i个数的和=>dp[i]=d... 阅读全文
posted @ 2015-08-02 14:39 mithrilhan 阅读(158) 评论(0) 推荐(0)
摘要:总结一下凸包维护规律: 斜率为负,从小到大,维护U左半部分凸包,求最小y截距 斜率为负,从大到小,维护倒U右半部分凸包,求最大y截距 斜率为正,从小到大,维护U右半部分凸包,求最小y截距 斜率为正,从大到小,维护倒U左半部分凸包,求最大y截距 阅读全文
posted @ 2015-08-02 13:03 mithrilhan 阅读(402) 评论(0) 推荐(0)
摘要:通道题意:给你n个矩形,长宽已知,求用不超过k个大矩形包含所有给定矩形,使得大矩形总面积和最小思路:dp[i][j]表示前i个用j个大矩形的最少面积 ,则dp[i][j]=Min(dp[k][j-1]+w[i]*h[k+1]) ,斜率维护。代码:#include#includeusing names... 阅读全文
posted @ 2015-08-02 12:35 mithrilhan 阅读(186) 评论(0) 推荐(0)
摘要:通道题意:求出长度大于k子序列使得其各个元素之和的平均数最大,并输出最大平均值思路:浅谈数形结合思想在信息学竞赛中的应用代码:#include#include#include#include#includeusing namespace std;const int MAXN=100010;int s... 阅读全文
posted @ 2015-08-02 12:24 mithrilhan 阅读(206) 评论(0) 推荐(0)
摘要:通道题意:给出n个数字,要你把这n个数字分成m堆,每一堆的价值是(max(val)-min(val))^2要你求出分成m堆之后得到的最小价值思路:排序,dp[i][j]表示前j个数字,分成i堆的最小价值,dp[i][j]=min(dp[i-1][k]+(val[j]-val[k+1])^2) 。代码... 阅读全文
posted @ 2015-08-01 22:52 mithrilhan 阅读(192) 评论(0) 推荐(0)
摘要:通道思路:x排序,去除无用点,会发现x升序,y降序,然后dp[i]=min(dp[k] + x[i] * y[k+1])代码: 1 #include 2 #include 3 #include 4 5 using namespace std; 6 7 typedef long long l... 阅读全文
posted @ 2015-07-31 16:54 mithrilhan 阅读(252) 评论(0) 推荐(0)
摘要:题意:有n 个玩具需要装箱,每个玩具的长度为c[i],规定在装箱的时候,必须严格按照给出的顺序进行,并且同一个箱子中任意两个玩具之间必须且只能间隔一个单位长度,换句话说,如果要在一个箱子中装编号为i~j 的玩具,则箱子的长度必须且只能是l=j-i+sigma[c[k]],规定每一个长度为 l 的箱子... 阅读全文
posted @ 2015-07-31 16:41 mithrilhan 阅读(238) 评论(0) 推荐(0)
摘要:通道题意:有一段铁路有n个站,每个站可以往其他站运送粮草,现在要炸掉m条路使得粮草补给最小,粮草补给的公式是将每个站能收到的粮草的总和思路:dp[i][j]表示到j为止的前面炸了i条路的得到最小总数,cost[i][j+1]>cost[i][j],单调递减,满足。代码:#include #inclu... 阅读全文
posted @ 2015-07-31 16:37 mithrilhan 阅读(174) 评论(0) 推荐(0)
摘要:通道题意:给定一个长度为n的序列,和一个常数m,我们可以将序列分成随意段,每段的权值为sum(arr[i]) + C(l 2 #include 3 4 typedef long long ll; 5 6 const int MAX_N = 500007; 7 8 struct Point ... 阅读全文
posted @ 2015-07-29 13:34 mithrilhan 阅读(167) 评论(0) 推荐(0)