摘要: 题目连接:http://new.tyvj.cn/Problem_Show.aspx?id=1215思路:方程再简单不过了:dp[i]表示以第i个人为某一组最后一个人的总战斗值dp[i]=max(dp[j]+F(sum[i]-sum[j]))其中F(x)=A*x*x+B*x+C sum[i]表示战斗值的前缀和显然n^2的方程,只能得到20分单调性显然,那么就开始我们的斜率优化设j<k且满足k比j更优dp[j]+A*(sum[i]-sum[j])^2+B*(sum[i]-sum[j])+C<=dp[k]+A*(sum[i]-sum[k])^2+B*(sum[i]-sum[k])+C化简 阅读全文
posted @ 2012-10-06 20:00 proverbs 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 前记:好像半年前就见过这道题,折腾了半天都不会,刚学斜率优化,发现这题挺经典的,也不难,只要能想到倒推~题意:N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务。 从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti。在每批任务开始前,机器需要启动时间S,而完成这批任务所需的时间是各个任务需 要时间的总和(同一批任务将在同一时刻完成)。每个任务的费用是它的完成时刻乘以一个费用系数Fi。请确定一个分组方案,使得总费用最小。分析:dp[i] = min(dp[j] + (s + sumt[i] - sumt[j]) *sumf[ 阅读全文
posted @ 2012-10-06 18:23 proverbs 阅读(399) 评论(0) 推荐(0) 编辑
摘要: 此题有是方程好写,优化很难(对于神犇们,简直太水了)的一道题建议做这道题之前先看这道题:http://www.lydsy.com/JudgeOnline/problem.php?id=1010题意:将一个升序的,有N个元素的序列,分组。要求每组的元素不少于K个,计算出组内各元素与最小元素的之差的和,将每组的这个值加起来,其和要最小。思路:由以上可得DP方程:dp[i]=MIN(dp[j]+sum[i]-sum[j]-(i-j)*arr[j+1]); j<i-k+1开始斜率优化(不考虑每组不少于K个元素):1.证明较优决策点对后续状态影响的持续性证明很简单,不证了,有兴趣的话,参考上一篇文 阅读全文
posted @ 2012-10-06 17:01 proverbs 阅读(427) 评论(0) 推荐(0) 编辑
摘要: 考试的时候偷懒,写的map,结果被卡了。。。20分。。我这弱菜、、其实此题很水。。。思路:明显的最短路,就是写hash呗。。表示从来没写过hash,一直用map水的。。头一次写hash,还1A了~嘿嘿,细心点就好PS:我的hash函数不取摸是完美的。View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <string> 5 #include <algorithm> 6 #include <iostream> 7 阅读全文
posted @ 2012-10-05 15:29 proverbs 阅读(243) 评论(0) 推荐(0) 编辑
摘要: 题意:最长公共上升子序列思路:以前都是写的n^3的,今天听说有n^2算法,就看了一下。其实就是n^3的优化以前n^3的方程是:dp[i][j]表示以a串的前i个数字且以b[j]结尾的的最大的LCIS的长度转移是:dp[i][j]=max(dp[i][j],dp[i-1][k]+1) a[i]==b[j]&&b[k]<b[j] 1<=k<jdp[i][j]=max(dp[i][j],dp[i-1][j]) a[i]!=b[j]现在开始优化:第一个方程是n^3的,i,j两层循环是肯定干不掉的,那我们就想办法干掉k的这层循环可以观察发现循环i层的状态是由i-1层转移 阅读全文
posted @ 2012-10-05 10:13 proverbs 阅读(738) 评论(0) 推荐(0) 编辑
摘要: 题意:给出一个N*N的矩阵,要查询任意B*B子矩阵内的元素最大值和最小值之差。思路:没神马思路可言。刚刚做完一道RMQ,正好碰到这道题。。果断二维RMQ。不要听到“二维”就想到二维线段树,应该想到二维树状数组(指变成复杂度)二维RMQ 和就是在一维的基础上及一层循环详见代码~View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <string> 4 #include <cstdlib> 5 #include <iostream> 6 #include <cma 阅读全文
posted @ 2012-10-05 08:35 proverbs 阅读(956) 评论(0) 推荐(0) 编辑
摘要: 这个提出的真心非常好!YM!题意:给定一棵无根树,问至少需要添加多少条边,使得每个节点属于且仅属于一个圈,并且,每个圈的节点数至少为3。若无解则输出-1,否则输出至少添加的边数。题解:如果不知道这个是TreeDP的话或者我大概会往图论方面想的,求SCC啊之类的。自己YY的时候没有注意到,如果是两个子链合成一个圈的话,那么根节点一定是属于该圈,于是一直在郁闷怎么分类讨论若干种转移,毕竟这种写法还是太奇葩了。一开始我的状态设计是:f[0, u]表示根节点u属于某个圈,且以u为根的整棵子树都符合要求,所需要添加的最少边数。f[1, u]表示根节点u属于某条链,且以u为根的整棵子树除了该链之外都符合要 阅读全文
posted @ 2012-10-04 22:03 proverbs 阅读(486) 评论(0) 推荐(0) 编辑
摘要: 题意:容器中有 n 种原子,现提供 m 种光子,这 n 种原子中能量之差等于提供的 m 种光子之一所具有的能量,就认为这两种原子是处在容器在是危险的,现在要求取走一些原子,使得容器中的原子处在一块是安全的,同时要求剩下的原子的能量和最大。思路:很明显的树形dp,每两个处于会产生危险的原子连一条无向边,注意建图完了可能是一个森林!PS:不会有环么?我AC了以后才发现这个问题。。。网上都没提这事,不知道我没完全理解题?View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 阅读全文
posted @ 2012-10-04 21:02 proverbs 阅读(327) 评论(0) 推荐(0) 编辑
摘要: 题意:有一道线性篱笆由N个连续的木板组成。有K个工人,你要叫他们给木板涂色。每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到的钱。要注意的是,工人i可以选择不涂任何木板,否则,他的涂色区域必须是连续的一段,并且S[i]必须包含在内。 最后还有,每块木板只能被涂一次。思路:第一眼,水题~dp[i][j]表示第i个人刷的最后一面墙是j时的最大获利一看数据范围,我水了。。。怎么优化呢?dp[i][j]含义同上dp[i][j]=max(dp[i-1][k]+(j-k)*p[i]) j-l[i]+1<=k+1<=s[ 阅读全文
posted @ 2012-10-04 20:55 proverbs 阅读(2149) 评论(0) 推荐(0) 编辑
摘要: 题意:定义一种操作,操作i就是将a[i]-a[i+1]取出进行合并,再加入到a[i]的位置(我自己臆测的题意),进行n-1次操作后,会剩下一个数字。给定a[1]~a[n]及目标t(最后剩下的数字),求操作顺序。思路:相当经典!此题相当于在序列之间添加+-两种符号使得答案是t最后按照+-号输出就是了PS:第一个符号必定是减号!View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 5 #define N 120 6 #define WC 10000 7 8 using 阅读全文
posted @ 2012-10-04 14:45 proverbs 阅读(354) 评论(0) 推荐(0) 编辑