摘要: 动态规划黑书的例题,老题了,2000年的国赛题,题意看黑书吧,太长了。。。比较典型的按阶段性决策,整个dp还是不难想的,1A分析在代码中/*按时间决策的DP,或者说按阶段性决策当前要跳的格子出现了,那么怎么跳其实只有两种选择,用左脚去踩或者右脚去踩所以要枚举前一个格子结束的时候,左右脚在什么地方,如果用左脚踩会产生多少花费,用右脚踩会产生多少花费dp[i][l][r]表示踩完第i次,左脚在l这个格子上,右脚在r这个格子上的最小花费那么最终要找的答案在dp[n][l][r]中,所以要扫描一次dp[n]找到最大值由题目的性质就知道可以使用滚动数组,而且题目也没提到序列的长度,所以用滚动数组也更为保 阅读全文
posted @ 2013-03-23 23:08 Titanium 阅读(317) 评论(0) 推荐(0) 编辑
摘要: 选拔赛的题目,关键路径继续延续着比赛的时候做不出,一回宿舍就1A的悲惨命运。这题题意还是很易懂的,不说题意了,然后一看就是一个关键路径。一个例子就是造汽车,造各种零件的时间不同,要凑齐一些零件后才能造另一些零件,问最后汽车最早什么时候造完。有个关键就是,如果一些零件还没有造完,而你手头上有事情可做,那么就去做,千万不要等那个零件,这样就是最优的。如果手头上没有事情可做,都是在等待的,那么只好等待了,而等待到某一个事情能开始做了,那么就做去做,就变回了上面的那种情况,但是要记得把刚才等待的时间算上去这个其实算是模板题,关键路径大家都学过,但是不一样都做过题,我细想才发现原来我没做过这类题只是知道 阅读全文
posted @ 2013-03-23 20:56 Titanium 阅读(407) 评论(0) 推荐(0) 编辑
摘要: 可能要求解两种问题,一种是完成所有的任务的最早时间,这个其实只是求解关键路径问题的一部分,另一种是要输出关键路径(关键路径不一定是唯一的)定义:关键路径就是求始点到终点的一条最长路径,通过求各顶点的最早完成时间来求关键路径两个重要概念(容易混淆,容易越想越糊涂)1.最早完成时间:自始点(记为V1)开始沿最长路径(按权计算)到达Vi所需要的时间,成为Vi的最早完成时间,记为TE[i] TE[1]=0; (准确来说应该是拓扑排序中的第一个点为0,而第1个点不一定只有1个,而且编号不一定为1,这里只是举一个例子,另外时间也不一定是0,看从什么时候开始计时) TE[j] = max (TE[i] .. 阅读全文
posted @ 2013-03-23 20:55 Titanium 阅读(831) 评论(0) 推荐(0) 编辑
摘要: 最小路径覆盖先把相同的数字去掉即去重,按整除或者被整除关系建立有向图,可知这个有向图一定是无环的(DAG),转化为最小路径覆盖模型#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define MAX 1010bool vis[MAX];int mat[MAX];long long a[MAX];int first[MAX];struct edge{ int u,v,next;}e[MAX*MAX];int nume;void add(int u , int 阅读全文
posted @ 2013-03-23 12:33 Titanium 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 最小点覆盖和最小路径覆盖的定义就不说了,百度可以找到但是百度一般找不到证明,而且很多证明可能是错的,或者不严谨后来在Matrix67博客找到了最小点覆盖的证明,是看过最严谨的了下面是原文地址http://www.matrix67.com/blog/archives/116但是最小路径覆盖还是找不到可靠的证明,不过幸好黑书中有提及,虽然不详细,但是如果看明白了最小点覆盖的证明,最小路径覆盖也不难了下面是黑书的原文,关于最小路径覆盖的证明最小路径覆盖:用尽量少的不想交的简单路径覆盖有向无环图G的所有顶点。我们给这个图建立一个二分图模型,把所有顶点拆为两个:X结点i和Y结点i‘,如果图G中存在有向边 阅读全文
posted @ 2013-03-23 12:30 Titanium 阅读(1128) 评论(0) 推荐(0) 编辑