摘要: 题目链接: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) 编辑
摘要: 题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4519方法:模拟,如果员工人数小于等于医生人数,则有多少检查项目就需要多少分钟,否则,设有m个医生,则在员工中的前m个的一项先被m个医生并行检查,这样耗去1分钟,然后移动到后m个,依次平移,当后面所剩余的员工不够m时,开始不够的那个员工边重新定位到开始位置,这样,多次迭代,总是最开始检查的员工完成检查,这样前面的员工边不再检查,就要为每次回绕的时候设置新的开始位置,直到开始位置大于员工数量。代码:#include#include#include#include#include using names 阅读全文
posted @ 2013-07-31 16:45 kbyd 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4527方法:模拟,当一滴水滴在一个cell里后,如果不爆就直接给cell的值加1,否则,设置为0,模拟爆炸,再将爆炸一秒后水滴会出现的位置已经当前飞行的方向合成为一个状态结构并记录在一个数组的st到ed段,这里st=1,ed最多为4,因为爆炸一秒后水滴有可能已经飞离棋盘,然后扫面st到ed中的每个状态对应位置p,对p位置的水滴量q,如果q==0,则水滴会按当前方向继续往前飞,则下1秒水滴到达的新位置和与当前方向一样的方向合成为一个新的状态放在ed的后面;如果q!=0,则直接给相应位置的水滴量加1即可 阅读全文
posted @ 2013-07-31 15:12 kbyd 阅读(246) 评论(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 阅读(167) 评论(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 阅读(151) 评论(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 阅读(235) 评论(0) 推荐(0) 编辑
摘要: 二分图点覆盖数就是二分图最大匹配数的证明过程的原文地址如下:http://www.matrix67.com/blog/archives/116然后为了便于注解,将原文复制在下面:“König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数。如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选了一个点就相当于覆盖了以它为端点的所有边,你需要选择最少的点来覆盖所有的边。比如,下面这个图中的最大匹配和最小点覆盖已分别用蓝色和红色标注。它们都等于3。这个定理相信大多数人都知道,但是网络上给出的证明并不多见。有一些网上常见的“证明”明显是错误的 阅读全文
posted @ 2013-05-16 11:10 kbyd 阅读(318) 评论(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 阅读(167) 评论(0) 推荐(0) 编辑