随笔分类 -  算法训练-动态规划

摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561方法:表面上看输入是一个森林的结构,其实可以用0节点作为父节点将森林中所有的树串起来作为一个树,然后开始DP,设F(P,x)是P为根的子树上选x个能获得的最大值的集合。 { {0}; x==0F(P,x) = {v+P的价值|v属于{F(s,x1)|s是p的直接子节点 && 0#include #includeusing namespace std;int n,m;struct Staff{ int cost; int value;};struct A... 阅读全文
posted @ 2013-08-07 17:44 kbyd 阅读(200) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520方法: 领导选择出现,则其直接下属不能出现,领导选择不出现,则其直接下属可出现可不出现,设F(P,0)为一个员工不出现能得的最大值,F(P,1)为一个员工要出现能得的最大值 { sum({F(S,0)|S是p的直接下属})+p的有趣度;P为非叶子F(P,1)= p的有趣度;P为叶子 }, { sum({ min(F(S,1),F(S,0)) |S是p的直接下属 });P为非叶子F(P,0)= 0;P为叶子 }原来问... 阅读全文
posted @ 2013-08-07 15:52 kbyd 阅读(196) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054方法:一个节点选了,则其直接子节点可选可不选,一个节点没有选,则直接子节点必须选,所以建议状态转移方程设F(P,0)为没有选择p点最少要用多少点,F(P,1)为选择p点最少要用多少点 { sum({F(S,1)|S是p的直接子节点});P为非叶子F(P,0)= 0;P为叶子 }, { sum({ min(F(S,1),F(S,0)) |S是p的直接子节点 })+1;P为非叶子F(P,1)= 1;P为叶子 }原来问题... 阅读全文
posted @ 2013-08-07 15:24 kbyd 阅读(203) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196方法:设FSdist[i].dist1为第i个节点到叶子最长路径,FSdist[i].dist1.dist为路径的距离,FSdist[i].dist1.entry为路径入口,FSdist[i].dist2为次长路径(如果存在次长路径的话,dist2中的信息和dist1一样。F[i].dist1.dist是第i个节点在树种一个节点的最长路径的距离,p[i]是第i个点的直接父节点,dist(x,y)为x 到y的距离,那么 { FSdist[i].dist1 , i是根节点... 阅读全文
posted @ 2013-08-06 17:11 kbyd 阅读(259) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074方法:设一个数num,科目的数量为n,则将num表示成带有前导0的n位二进制数(num肯定不能超范围),在该二进制数的数位中,从左到有第i个数位是1代表第i门课的作业完成,0代笔没有,如n=4,num=6=0110代表第2和3门的作业完成,设置状态转移方程,设F(num,k).Ans为 当完成k门课程,完成的科目是num对应的作业完成情况,这一状态下超期的最少天数。F(num,k).Beyond为 当完成k门课程,完成的科目是num对应的作业完成情况,这一状态已经超期的天数,F(num,k). 阅读全文
posted @ 2013-08-02 16:05 kbyd 阅读(224) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1158方法:设f(n,i)表示第i个月介绍还保留着n需要的最少钱,设max需要人数最多的哪个月所要的人数,needed[i]为第i月需要的人数。 { n*hireCost + n*hireSalary; i==1 && needed[1]=lr?(hireCost*(n-lr) +n*hireSalary) :(fireCost*(lr-n) +n*hireSalary) ; | lr是上个剩余的人数} );i>1 && needed[i]#include//# 阅读全文
posted @ 2013-06-28 15:02 kbyd 阅读(183) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1208方法1:正向状态转移,设x,y为当前的位子,设f(x,y)为到达右下角这一目标所需要的方案数,matrix(x,y)是当前可以前进的步数:f(x,y) =matrix(x,y) == 0 ? 0:((x,y)处于目标位子 ? 1 :sum(f(x1,y1)| (x1,y1)为(x,y)这一位置横向或纵向能到达的并且在地图里的地方));原问题的解为 f(0,0)代码:#include#include#include#define max 1000001using namespace std;in 阅读全文
posted @ 2013-06-28 14:03 kbyd 阅读(172) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1723方法:根据题意,设st为传递消息开始的人,ed是接收消息的最后一个人,m为每个最多可以向后传达的人数(距离),F(st,ed)为从st到ed传递消息的方式个数,建立如下状态转移方程: {F(st,ed) = 1 ,st==ed; 0 ,st>ed; sum(F(st+i,ed)|1//#include#includeusing namespace std;int records[32][32];int t_records[32][32];in... 阅读全文
posted @ 2013-06-28 10:31 kbyd 阅读(253) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025方法:求最大递增非连续子序列朴素的方法是o(n^2)的时间复杂度,而该题要超时,所以用二分的,具体实现参见链接http://www.programfan.com/blog/article.asp?id=13086感想:熟悉上述链接的定理证明。代码:View Code #include<iostream>#include<math.h>#include<algorithm>#include<stack>using namespace std;int 阅读全文
posted @ 2013-05-02 11:36 kbyd 阅读(179) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160方法:建模后首先对速度降序排序,然后再排序后的结果序列中找一个最长的递增非连续子序列,并且记录前驱。感想:虽然以来就根据速度排了序,但是要注意速度相等的情况。代码:View Code #include<iostream>#include<math.h>#include<algorithm>#include<stack>using namespace std;int const MAX =0x3f3f3f3f;struct Mouse{ int w 阅读全文
posted @ 2013-05-02 10:38 kbyd 阅读(208) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078方法:由于该题目中是二维数组,并且每一个cell都可能被从几个方向探寻到,而不是一维的那样只会被从前往后的方向探寻到,所以,这里需要对这些cell(除起始点那个)根据里面含有的cheese量递增排序,然后根据这个顺序去考虑cell。可以这样理解,计算一个cell A作为当前递增非连续子序列最后一个元素时能获取多少的值,对于b,c ,d,e ....这些可以直接移动到a的cell,首先要计算出b,c ,d,e。。这些cell作为递增非连续子序列最后一个元素时能获取多少的值,这是他们的最优解,然后 阅读全文
posted @ 2013-05-02 10:08 kbyd 阅读(211) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1881方法:设F(i,n)为当考察到第i个bg,在第n天的时候,能获取的最大快乐,当然该bg要对一天获得的快乐度产生影响,则必须要第i个bg的结束时间i_deadLine小于等于n,已经当天减去其持续时间i_duration,设每个bg的快乐度是i_pleasure,bg的数量为count,状态转移方程如下: F(i,n) = Max(F(i,n-i_duration)+i_pleasure, F(i,n)), n<= i_deadLine and n-i>=0;对每一个bg都做以上的考 阅读全文
posted @ 2013-04-26 15:56 kbyd 阅读(436) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1903方法:设F(currency_type,n) 为在第n天,如果要持有currency_type的钱,那么以该currency_type为单位能获得的钱多是多少。设0代表加元,1代笔美元,p_rate为美元用加元表示的价格,c_rate表示佣金收取率,就是手续费,防过度投机的。状态转移方程是: { Max(F(0,n-1),F(1,n-1)*p_rate*c_rate), currency_type == 0;F(currency_type,n) = ... 阅读全文
posted @ 2013-04-26 15:08 kbyd 阅读(256) 评论(0) 推荐(0)
摘要:View Code #include<iostream>//#include<math.h>//#include<algorithm>//#include<queue>//#include<stack>using namespace std;int const MAX =0x3f3f3f3f; struct state{ int remainDriving; int divingDist; int fDist; double time;};int main(){ int totalLengh; int chargerCount,dri 阅读全文
posted @ 2013-04-26 14:34 kbyd 阅读(194) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1421方法:首先对于这些重量乱序的物品,需要排序来贪心初始化然每件物品在选择的时候,都是选择与其重量最接近的。然后建立状态转移方程,设F(k,i)为当选择第i物品的时候,从中选择k对物品的最小疲劳度,staff[i]为排序好了的物品中第i个的重量,方程如下: { (taff[2] - staff[1])^2, k==1 and i==2;F(k,i) = Max( (staff[i]- staff[i-1])^2, F(k,i-1) ), k==1 and i>=3; ... 阅读全文
posted @ 2013-04-23 20:27 kbyd 阅读(185) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4472方法:该题目不是最优解类型的dp,属于排列组合的dp,根据题目建好模型后得到如下状态转移方程: { 1, n==1;F(n) = Sum{F((n-1)/x)| (n-1)%x == 0 && 1<=x<=n-1}, n>=2; }最终F(N)为解。感谢:简单题。代码:View Code #include<iostream>#include<math.h>//#include<algorithm>//#include< 阅读全文
posted @ 2013-04-23 15:55 kbyd 阅读(157) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4526方法:设F[x,m]为在m分钟,已经累积走了x人所花了多少钱最少为多少,设在第i分钟可以累计走的最大人数是c(i),出租车在第i分钟每人需要的额外等待价格p(i),有剩余作为数量a(i),出租车基础价格p,学生总数totalStdCount,总时间为M,状态转移方程是:F[x,m] = Min{ F[i,m-1] +(x-i)*p(m)+p | 0<=i<=c(m-1) and i<=x<=Min(c(m-1)+a(m) , totalStdCount)and x-i 阅读全文
posted @ 2013-04-23 15:33 kbyd 阅读(202) 评论(0) 推荐(0)
摘要:题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4502方法:设F(m)为在第m天累积到的工资,第i个工作开始时间为bi,结束时间ei,工资为si,总共天数M。建立状态转移方程: { 0, m==0;F(m) = Max(F(bi-1)+si,F(m)); m>=ei, F(m), m<ei; }.最终F(M)为问题的解。通过2重循环循环来实现对工作的处理顺序是按照工作的结束时间来的,这样就不需要排序。感想:需要动点脑筋建下模。代码:View Code #include<iostream>using namespace s 阅读全文
posted @ 2013-04-23 14:59 kbyd 阅读(172) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084方法:是对于每一个塔中第x行第y个位子的地方,设其所累加的最大和F(x,y),当前位子本来就有的数字current(x,y),当前位子处于的行的元素个数cx.则状态转移方程为: { Max(F(x-1,y)+current(x,y),F(x-1,y-1)+current(x,y));F(x,y) = 1, x==1 and y==1; 0, x<0 or y<0; } 感想:简单题。View Code #include<iostream>using n... 阅读全文
posted @ 2013-04-22 14:38 kbyd 阅读(151) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2571方法:建立状态转移方程,设F(x,y)为当前走到获得的最大幸运值,current(x,y)为当前位置本来就具有的幸运值,则方程为: { 0, x<1or y<1;F(x,y) = Max( {F(x-1,y)+current(x,y)}U{ F(x,yi)+current(x,y) |(yi%y==0 and yi!=y)oryi+1==y} ); current(1,1), x==1 and y==1; }在自底向上的时候,需要考虑一个位子列数c的小于... 阅读全文
posted @ 2013-04-22 14:02 kbyd 阅读(184) 评论(0) 推荐(0)