08 2013 档案

摘要:题目链接: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 阅读(182) 评论(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 阅读(171) 评论(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 阅读(179) 评论(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 阅读(237) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1123方法:和使用堆栈来计算四则混合运算一样,唯一的区别在于计算两个操作数的时候不是计算运算结果,和计算起表达式,这里操作数也是表达式,表达式根据符号计算出新的表达式。规定:1.单个操作数是一个表达式,优先级是3,表达式运算符号未知。这种表达命名是E12.两个E1(就两个单操作数)可以根据操作符号形成一个行的表达式,优先级由操作符来定(加减为1,乘除为2),表达式运算符就是操作操作符。这种表达命名是E23.两个E2可以根据操作符号形成一个行的表达式,优先级由操作符来定(加减为1,乘除为2),表达式运 阅读全文
posted @ 2013-08-06 12:17 kbyd 阅读(512) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1100方法:首先根据输入的n判断出树里有多少个点m,然后设点数小于等于m的数的形态个数为x,则远问题转换成求n个点组成的树中排名第n-x的树的形态设buildTree(count,order)为建立count的点组成的树中排名order的树。核心就在该函数里。先设i是左子树的个数,0#include #include using namespace std;int catalan[18]={1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 阅读全文
posted @ 2013-08-05 19:09 kbyd 阅读(409) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1789方法:既然一个作业超期了,不管超期多久都只扣一次固定的学分。又因为每个作业只要一天,所以可以看出n个作业n天就可以做完,那些截至日期大于n天的就不用考虑了。只考虑截至日期在n天内的。可以这样考虑,设截至日期在n天内的作业如果全部按时完成的话得到的学分的和是sum,再设一个实际获得学分t_sum(初始0),然后一个作业按时完成 t_sum就加上学分,超期的就不管,然后把原来的问题转变为在截至日期在n天内的作业中安排一个顺序使得获得的学分之和t_sum最大,然后用sum-t_sum得到扣除的最少学 阅读全文
posted @ 2013-08-05 17:10 kbyd 阅读(214) 评论(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 阅读(206) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4513方法:模拟,定义数组counts[i]记录当第i个元素必须以一个序列最后一个元素的身份选择出来,该序列的长度是多大,使用countsEqual[i]表示第i元素直接前面包括自己有多少个连续的数字的值等于它自己。如对于数据: index: 1 2 34 5 6 7 8 9 10 11 12 value: 1 11 12 21 25 25 25 252112 12 12counts[i]: 1 1 1 1 1 2 3 4 6 82 3countsEqual[i]:11 1 1 1 2... 阅读全文
posted @ 2013-08-01 15:02 kbyd 阅读(278) 评论(0) 推荐(0) 编辑
摘要:题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4512方法:F(a,b)为在a,b段间能获得找出的最多人数,则原问题的解为:F(1,n)=Max({F'(i,n)| 1=#include #include #include using namespace std;int nums[201];int dp[202][202];int n;int found(int x,int st,int ed=n){ if(dp[st][ed]!=-1) return dp[st][ed]; if(st==ed) return 1; int newEn. 阅读全文
posted @ 2013-08-01 10:51 kbyd 阅读(154) 评论(0) 推荐(0) 编辑