摘要: 来自: 外刊IT评论下面是 stackoverflow 网站上网友针对你看到过的最好的代码注释是什么样的?这个问题给出的回答的前10条:1、// 亲爱的维护者:// 如果你尝试了对这段程序进行‘优化’,// 并认识到这种企图是大错特错,请增加// 下面这个计数器的个数,用来对后来人进行警告:// 浪费在这里的总时间 = 39h2、/** * 致终于来到这里的勇敢的人:你是被上帝选中的人,英勇的、不辞劳苦的、不眠不修的来修改我们这最棘手的代码的编程骑士。你,我们的救世主,人中之龙,我要对你说:永远不要放弃,永远不要对自己失望,永远不要逃走,辜负了自己。永远不要哭啼,永远不要说再见。永远不要说谎来 阅读全文
posted @ 2012-05-05 10:49 dgsrz 阅读(110) 评论(0) 推荐(0) 编辑
摘要: 一道变形的01背包,起初我脑残地将总概率乘100作为最大背包容量,对洗劫每个银行被抓的概率乘100视作物品体积进行dp,结果wa了好几次后来知道这类问题一般不这么操作的,子状态存的是概率而不是物品总数所以获得方程:dp[j] = max(dp[j], dp[V-c[i]]*(1-p[i]))dp[j]: 偷得j件物品不被抓的概率,V: 最多可以抢劫的物品总数其他还要注意初始化,dp[0] = 1,什么都不偷也就是不被抓View Code 1 #include <iostream> 2 using namespace std; 3 4 //dp[i]: 偷i件商品不被抓的概率 5 . 阅读全文
posted @ 2012-05-05 09:45 dgsrz 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 这道DP基本类似数塔,可以从上到下分析,从下到上计算。考虑清楚每种状态时的决策,处理好边界,就可以AC。数据规模不大,考虑到每个空的值的绝对值小于100,于是输入前先把每个空置为负无穷。留下最右下角数的右边、下边为0。代码: 1 #include <iostream> 2 using namespace std; 3 4 const int INF = 1 << 29; 5 int map[25][1005]; 6 7 void clear() 8 { 9 for(int i = 0; i < 25; i++)10 for(int j = 0; j < 10 阅读全文
posted @ 2012-03-20 20:31 dgsrz 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 【简单题,试着分析一下,发现自己表达能力不够好哈】题意:给一个数N,计算N!末尾有几个0。因为这道题出现在动态规划的作业中,一开始也尝试着去DP了下。结果案例总是通不过。DP功力还不够。看来,还要用做数学题的办法试试。如果使末尾多一个0,那么这个可以由2 * 5得到;如果末尾多两个0,可以由4 * 25得到;推广:末尾0的个数 等式 等式左边 等式右边 1 2 * 5 2^1 5^1 2 4 * 25 2^2 5^2 3 8 * 125 2^3 5^3 ... ... ... 阅读全文
posted @ 2012-03-12 22:51 dgsrz 阅读(155) 评论(0) 推荐(0) 编辑
摘要: LIS:Longest Increasing Subsequence 最长上升子序列昨天用O(n^2)的方法做了HDU的导弹题,同样的,求LIS还有O(nlogn)的优化方法。在这里,我们用sub保存一个最长上升子序列,top表示其长度。我们要做的就是让top尽可能的大。算法:每次输入一个数x,判断它和sub顶部的元素大小关系。if x = sub[top] then sub[++top] <- xelse sub[第一个比x大的元素位置] <- x于是,这变得有些不像DP了。而查找第一处比x大的元素位置,又可以使用二分法优化,于是整体的复杂度就为O(nlogn)了。援引百度知道l 阅读全文
posted @ 2012-03-08 19:44 dgsrz 阅读(393) 评论(0) 推荐(0) 编辑
摘要: 这个星期进入DP专题。先是基本概念。。(摘抄课件,我自重= =)动态规划(Dynamic Programming, DP)是解决某一类问题的一种方法,是分析问题的一种途径,而不是一种特殊算法(如线性规划是一种算法)。因此,在学习动态规划时,除了对基本概念和方法正确地理解外,应以丰富的想象力去建立模型,用创造性的技巧去求解。动态规划三要素:阶段,状态,决策。动态规划用于解决多阶段决策最优化问题,但是不是所有的最优化问题都可以用动态规划解答呢?一般在题目中出现求最优解的问题就要考虑动态规划了,但是否可以用还要满足两个条件:¢最优子结构(最优化原理)当前状态是前面状态的完美总结¢ 阅读全文
posted @ 2012-03-07 19:50 dgsrz 阅读(721) 评论(0) 推荐(2) 编辑
摘要: 终于弄明白邻接表这玩意了,说白了还是链表,只是存在多个头结点而已。所以写法上大可以参照链表,用一个head数组保存头结点。邻接表的好处还是挺多的,像这几天遇到的图论问题,使用邻接阵可能会引起MLE,或者,由于遍历了太多不必要的点,效率上也没有使用邻接表存储来的高。邻接阵最大好处,我想应该就是容易写,不易出错了吧。于是,结合自己的理解,写了三套模板。一套使用指针(普通的动态链表,可扩展,但也容易出错),第二套套为静态链表,第三套是STL实现。第一种动态链表: 1 #include <iostream> 2 #include <cstdlib> 3 #include < 阅读全文
posted @ 2012-03-04 15:10 dgsrz 阅读(244) 评论(0) 推荐(0) 编辑
摘要: 凸包问题首先将所有点按y左边递增排序。若遇到y坐标值相等,则x坐标最小的点优先。此时获得的第一个点(p[0])作为基点。第二次排序。排序依据:基点到其他点构成的向量与x轴逆时针方向夹角大小。求解凸包过程。首先将p[0]、p[1]两个点加入到路径中,用一个next保存路径的栈顶。每次和下一个点p[i]比较时,判断path[next]和p[i]各自到path[next - 1]构成的向量的夹角。如果是逆时针(大于0),将p[i]加入到路径栈。否则,next回退一步,即删除栈顶。如果这时的栈顶仍不满足条件,继续回退。直到条件成立(构成逆时针,且和p[i]构成的向量不共线),那么才将p[i]压栈。然后 阅读全文
posted @ 2012-02-23 20:51 dgsrz 阅读(303) 评论(0) 推荐(0) 编辑
摘要: 这道题题目描述一大串,但不难看懂。方法还是之前一样的向量积应用。向量积的正负,可以判断两个向量的位置关系。比如这道题找逆时针方向的点。中间找下一个点的算法,是学长指导的,自己想不到,果然技术上还是弱呢 1 #include<iostream> 2 #include<cmath> 3 #include<algorithm> 4 #include<queue> 5 using namespace std; 6 7 struct Point { 8 int index; 9 double x, y;10 };11 12 const double eps 阅读全文
posted @ 2012-02-22 23:00 dgsrz 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 题意,给出一块方框的左上、右下角坐标,然后输入n个挡板的两端点坐标(挡板从0~(n-1)标记),再输入m个玩具丢到框内的坐标。数据保证玩具丢到框里,且挡板已经从左到右排好序。输出落在每块挡板前空间内的玩具个数。类似的方法以前在杭电OJ遇到过,是一道计算多边形面积题目。当时没有学向量积运算,所以最后只是记了个多边形面积公式。POJ 2318这道题,也是叉积运算,恰好今天微积分讲了向量积基础内容,晚上集训队又继续深入了向量积的一些应用,于是这道题可以独立A掉了。由于输入的数据各种被保证,最终只需要依次计算两点是否在挡板同侧,边界处理、排序什么的全部免掉,当初担心的o(n^2)超时问题,也因为这题数 阅读全文
posted @ 2012-02-21 22:26 dgsrz 阅读(977) 评论(0) 推荐(1) 编辑