• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
 






This_poet——Only a poet

为省队而奋斗,为NOI而奋斗!This_poet@126.com
 
 

Powered by 博客园
博客园 | 首页 | 新随笔 | 联系 | 订阅 订阅 | 管理

随笔分类 -  动态规划

 
Poj1180 Batch Scheduling --- DP的斜率优化
摘要:题意N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务。从时刻0开始,这些任务被分批加工,第i 个任务单独完成所需的时间是Ti。在每批任务开始前,机器需要启动时间S,而完成这批任务所需的时间是各个任务需要时间的总和(同一批任务将在同一时刻完 成)。每个任务的费用是它的完成时刻乘以一个费用系数Fi。请确定一个分组方案,使得总费用最小。算法讨论毫无疑问DP.转移方程:dp[i]=Min{dp[j]+(sumF[i]-sumF[j])*sumT[i]+s*(sumF[N]-sumF[j])},其中dp[i]表示的是完成1~i的工作的花费+因为开机 阅读全文
posted @ 2011-11-30 13:26 This_poet 阅读(627) 评论(0) 推荐(0)
POJ1015 Jury Compromise——DP——被某些人害苦了!!!
摘要:水水的DP,网上居然有人说200*400*20会爆内存~于是想了一个滚动数组的,但是状态记录就不好办了,后来才发现200*400*20是没问题的……状态转移方程:dp[i][j]表示选出i个人、两方差值为j的时候两方价值和的最大值dp[i][j]=max{ dp[i-1][j-p[i]+d[i]]+p[i]+d[i] }记录路径的话,直接记录并倒推即可……参考代码:program poj1015;//By_Thispoetconst maxn=4000;var i,j,k,m,n,p,test :longint; mini,maxi :longint; f :array... 阅读全文
posted @ 2011-10-31 18:18 This_poet 阅读(615) 评论(0) 推荐(0)
POJ3590 The shuffle Problem——置换群+DP/递推预处理
摘要:显然,这是一个置换群问题,答案m就是将n这个数拆成k个(1=<k<=n),k个数能够得出的最小公倍数。简略证明:序列会被分为若干个群,每个群需要交换这个群的size次才能够回复原位,因此,问题转化成求将n这个数拆成k个(1=<k<=n),k个数能够得出的最小公倍数,以及满足题目要求的字典序最小的序列。DP预处理:dp[i][j]表示将i这个数字划分成j个,这j个数能够组成的最小公倍数。那么方程就是dp[i][j]=max{lcm(dp[k][j-1],i-k)} (j-1<=k<=i-1)注意,要令字典序最小,必须使划分的集合数尽量多,并按照集合大小从小到大 阅读全文
posted @ 2011-10-31 18:09 This_poet 阅读(600) 评论(0) 推荐(0)
PO3613 Cow Relays——矩阵乘法+快速幂(迭代)的变形应用
摘要:状态设计:d[i,j](k)表示经过k条边的i到j的最短路。因为用了迭代的方法,所以可以省略。状态转移:d[i,j](M)=d[i,k](M >>1)+d[k,j](M>>1)代码:program poj3613;//By_thispoetconst maxn=105;var i,j,k,m,n,p,q,s,e,tot :longint; num :array[0..maxn*10]of longint; d,b,map :array[0..maxn,0..maxn]of longint;function hash(i:longint):longint;begin if 阅读全文
posted @ 2011-10-20 14:46 This_poet 阅读(420) 评论(0) 推荐(0)
POJ2329 Nearest number - 2——Dp恶心题
摘要:按照从左上开始、从右上开始、从左下开始、从右下开始四个顺序来Dp,记录路径,如果最小路径不唯一那么这个点的权值为0.极其考察细心和耐心,数据还是比较弱的……代码:program poj2329;const maxn=205;var i,j,m,p,q,n :longint; map,f,dp :array[0..maxn,0..maxn]of longint; rec,g :array[0..maxn,0..maxn]of record x,y:longint;end; function min(i,j:longint):longint;begin if i<j th... 阅读全文
posted @ 2011-10-19 22:46 This_poet 阅读(675) 评论(0) 推荐(1)
POJ1390 Blocks——动态规划——pku1390
摘要:经典的动态规划,LRJ神牛的书上经典例题第一题。开一个三维数组,f[i][j][k]表示将i~j这一段,连上后面的k个格子全部消去所能够获得的最大价值。状态转移方程:f[i][j][k]=Max{ Max{f[i][p][len[j]+k]+f[p+1][j-1][0]}(color[p]=color[j] and i<p<j)//和前面某段一起消掉 f[i][j-1][0]+sqr(len[j]+k)//马上消掉这一段 }其中,len[i]表示第i段连续区间的长度,比如说样例1中的len值分别为1,4,3,1代码很简单:Program POJ1... 阅读全文
posted @ 2011-10-03 11:14 This_poet 阅读(790) 评论(0) 推荐(0)
POJ2018 Best Cow Fences——二分答案+贪心(动态规划)求最大子段和——pku2018
摘要:可以转换成二分答案求最大连续子段和来做。每次在a[i]的基础上减去二分出来的答案。求出长度不小于f的最大连续子段和。如果大于0,则调整下边界,否则调整上边界。求长度不小于f的最大连续子段和需要一些小技巧,比如说判断以i为终点的连续子段和,就可以看sum[i]-sum[i-f]+dp[i-f]的正负。其中dp[i]表以i为终点的最大连续子段和。具体见代码。Program cowfnc;//By_ThispoetConst maxn=100005;Var i,j,k,m,n,f,ans :Longint; l,r,mid :Longint; a,dp,sum,b :A... 阅读全文
posted @ 2011-09-29 20:30 This_poet 阅读(1195) 评论(0) 推荐(0)
POJ2486&&POJ3659 ——树形动态规划
摘要:两道题都折腾了很长时间,总算过了。树形动规,主要在于动规顺序,其次才是状态的设计。POJ2486:先用左儿子右兄弟表示法进行多叉转二叉。f[i][j]表示从i点出发走了j步、最后不一定要回到i点能吃到的最多苹果数g[i][j]表示从i点出发走了j步、最后回到i点所能吃到的最多苹果数动规方程比较复杂:f[i][j]=Max{f[left[i],k],g[right[i],j-3-k]+a[i]}(0<=k<=j-3)f[i][j]=Max{f[i,j],g[left[i],k]+f[right[i],j-4-k]+a[i]}(0<=k<=j-4)g[i][j]=Max{g 阅读全文
posted @ 2011-09-27 10:50 This_poet 阅读(1754) 评论(0) 推荐(0)
POJ1276 Cash Machine——背包+优化——pku1276
摘要:嗯,今天上午ywt命令我写二进制压位背包,于是今天下午犯了一下午的sx,然后终于做出来了。布尔型背包压位存储不会写,拿来练手。WA了N次,然后写不加优化的,还是WA,最后发现自己把二进制拆分边界条件写错了……看完lyd的题解,发现还有一种不用单调队列、不用压位、但是空间花销比较大的简单算法,贴个传送门吧:http://poj.org/showmessage?message_id=156751我的代码:Program Cash_Machine;//By_ThispoetVar i,j,k,m,n,p,q,v,c,a,b :Longint; f :Array[-1..4000... 阅读全文
posted @ 2011-09-24 16:46 This_poet 阅读(376) 评论(0) 推荐(0)
POJ3267 The Cow Lexicon——动态规划——pku3267
摘要:简单的动态规划。状态转移方程:f[i]=Min{f[i-1]+1,Make(i)}其中Make为自定义函数:表示取了i这个位置上的字符之后前面至少要删掉多少个才能满足条件。代码如下:Program Lexicon;//By_ThispoetConst maxn=300;Var i,j,k,m,n :Longint; f :Array[0..maxn]of Longint; std :Array[1..maxn*2]of String[25]; word :Array[0..maxn]of Char; temp :Longint; Function Mi... 阅读全文
posted @ 2011-09-21 08:13 This_poet 阅读(381) 评论(0) 推荐(0)
POJ2373 Dividing the Path——动态规划+单调队列优化
摘要:利用单调队列进行动态规划。状态转移方程很容易写出来的:f[i]=Min{f[j]}+1(i-2*b<=j<=i-2*a)这样,时间复杂度最坏情况下是O(n^2)的,对于n<=1000000的数据来说,程序根本无法承受怎么办呢?单调队列很强大!维护一个单调队列,队列里存的是按符合条件的f数组内值严格单调递增的下标值。很显然,利用队首元素就可以直接转移了。队首元素要满足的条件很简单嘛,i-2*b<=seq[h]<=1-2*a中间有一些小小的技巧,比如说,计算每个f值的时候,不是计算出来就将它插入到队列里,而是在计算f[i+2*a]之前把它插入队列中。不过说了,CODE 阅读全文
posted @ 2011-09-21 07:23 This_poet 阅读(1119) 评论(0) 推荐(0)
POJ3260 The Fewest Coins ——完全背包+多重背包——Pku3260
摘要:只需要对John的付款数做一次多重背包,对shopkeeper的找零钱数做一次完全背包即可。最重要的是上界的处理。可以注意到,John的付款数最多为maxv*maxv+m,也就是24400元。同理,shopkeeper找钱最多的数目为maxv*maxv.证明如下:如果John的付款数大于了maxv*maxv+m,即付硬币的数目大于了maxv,根据鸽笼原理,至少有两个的和对maxv取模的值相等,也就是说,这部分硬币能够用更少的maxv来代替。证毕。代码:Program Fewcoins;//By_ThispoetConst maxn=120; maxm=200000;Var i,j,k,m,n. 阅读全文
posted @ 2011-09-20 07:32 This_poet 阅读(772) 评论(0) 推荐(0)
POJ3265 Problem Solving ——动态规划——Pku3265
摘要:比较巧妙的动态规划。用f[i][j]表示第i个月,总工作了j道题目(从1~j),所能剩余的最多钱数。状态转移方程如下:f[i][j]=Max(m-∑b[j]-∑b[k]){其中,k应当满足f[i-1][k]>=∑a[j]-∑a[k]}注意最后输出的应该是ans+1,因为第一个月实际上是没有收入的。代码:Program Psolve;//By_ThispoetConst maxn=300;Var i,j,k,m,n,p,q,ans :Longint; a,b :Array[0..maxn]of Longint; f :Array[0..maxn*2,0..... 阅读全文
posted @ 2011-09-20 07:22 This_poet 阅读(505) 评论(6) 推荐(0)
POJ2392 Space Elevator ——动态规划初步——Pku2392
摘要:此题为一般的动态规划,为可能性动态规划。初态只需将f[0]:=true;在所有都不小于a[i]的条件下进行动态规划。状态转移方程:f[j+c[i]]:=true (if (f[j]=true) and (j+c[i]<=a[i]))注意动态规划的顺序:一定要倒推,否则会造成重复。CODEProgram Elevator;//By_PoetshyConst maxn=40000;Var i,j,p,n,max,re :Longint; f :Array[0..maxn]of Boolean; h,c,a :Array[1..400]of Longint; Fun... 阅读全文
posted @ 2011-09-02 20:48 This_poet 阅读(260) 评论(0) 推荐(0)
POJ2228 Naptime——动态规划+技巧性优化——Pku2228
摘要:本题是一个显然的动态规划题目。设计状态时,用f[i,j,1]表示第i段时间为止,已睡去j个时间段,且第i段时间睡觉获得的最大效用。反之,f[i,j,0]表示上述状态下[i]第i段时间不睡觉能获得的最大效用值。状态转移方程如下:f[i,j,0]:=Max{f[i-1,j,0],f[i-1,j,1]}f[i,j,1]:=Max{f[i-1,j-1,0],f[i-1,j-1,1]+u[i]}具体就不用多解释了,这题的关键不在方程上,而在于的是环形Dp的处理。上述方程从i=1开始顺推,推出的只能是第一段时间开始睡或者第一段时间没有睡的最大效用值,换句话说,就是无论如何没有把u[1]加入这个最大值中,但 阅读全文
posted @ 2011-09-01 17:53 This_poet 阅读(984) 评论(0) 推荐(0)
POJ1991 Turning in Homework——贪心+动态规划——Pku1991
摘要:贪心+ 动态规划。贪心思想:当有一段连续区间[i,j]未交时,取i或j是最优的。贪心思想证明:如果在[i,j]这段连续区间都没有被取的时候取了中间的m,那么后来一定要从m返回到i或者j,这时候是一定走了“冤枉路的”。而如果这时取了i或者j,那么到中间的时候m一定可以取。证毕。动态规划的方程这时候就简单了:f[i,j,0]表示[i+1,j]这一段连续区间都没有取,奶牛站在i上f[i,j,1]表示[i,j-1]这一段连续区间都没有取,奶牛站在j上方程:f[i,k,0]:=Min(Max(f[i-1,k,0]+a[i]-a[i-1],time[i]),Max(f[i,k+1,1]+a[k+1]-a[ 阅读全文
posted @ 2011-08-31 01:00 This_poet 阅读(534) 评论(0) 推荐(1)