Shirlies
宁静专注认真的程序媛~
上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 21 下一页
摘要: 题意:给你一个无向图,没有重边,没有自环,要你求该图中一颗生成树,但是这个生成树的最大边与最小边的差值要最小。如果固定一个最小边,求得最小生成树后,最大边也就知道了,其实这个也意味着在固定最小边的情况下最小生成树的最大边是固定的,可是为什么我们一定要求最小生成树呢,因为其他的生成树的最大边与最小边的差值要大于等于最小生成树的大小边之差,这个的原因大家可以自己仔细想想最小生成树的性质和次小生成树的求法(枚举每条最小生成树上的边,不要此条边求得的生成树,选最小一个就是了,这个就意味着次小生成树里面肯定有一条边要比最小生成树的大,其它的相同)。这样说来的话,我们只需将边排好序后,枚举每条边,并用Kr 阅读全文
posted @ 2012-09-02 12:29 Shirlies 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 我之前也没有搞过01规划,但是之前做过3621,3621这道题也用到了01规划,虽然我还是不太理解01规划,但是3621题解的推导过程给了我启示……∑cost[i]/∑len[i] <= ans∑cost[i] <= ans * ∑len[i]∑(cost[i] - ans * len[i]) <= 0当和小于0时说明ans需变小还有这一题目很自然就要用prim,题目只给了点的坐标和高度,而且点也不算太多,如果用Krustral要存的边会很多……而且第一个城市是首都,(there will be only one way to connect each village to 阅读全文
posted @ 2012-08-30 12:43 Shirlies 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 首先看题解,看到的是floyd,然后就往floyd方向去想,想不咋通,之后就问了队长,队长解释了一下就清楚了这一题用的是floyd和二分的思想,如果只是floyd的思想就是求任意两点之间距离为k(1<=k<=N)条边的最短距离,然后在此基础上求k+1条边的最短距离…… 1 #include <cstdio> 2 #include <cstring> 3 4 const int maxlen = 1000+10; 5 int N,T,S,E; 6 int map[maxlen][maxlen]; 7 int sign[maxlen]; 8 int tmp[ma 阅读全文
posted @ 2012-08-27 13:45 Shirlies 阅读(255) 评论(0) 推荐(0) 编辑
摘要: 不是自己推出来的公式,看题解了才知道这个三维DP公式dp[i][j][k] = dp[i-1][j][k] + dp[i][j-1][k] + dp[i][j][k-1](i >= j >= k)一看到这个题目,我的反应竟然是卡特兰数(一个有n个X和n个Y组成的字串,且所有的部分字串皆满足X的个数大于等于Y的个数。以下为长度为6的dyck words:XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY),n<=60,即使不是卡特兰数,结果应该也会很大,所以要用到大数相加(真心的讨厌写大数相加相乘相除等的代码,磨蹭了些许时间,才写@_@,唉,什么时候自己写个有 阅读全文
posted @ 2012-08-18 12:16 Shirlies 阅读(579) 评论(0) 推荐(0) 编辑
摘要: 就这样A了……我的思路大致是:获得生活费与花费的差(在纸上演练一下就清楚为什么了),这一题是求序列和要大于等于0的最长子序列,并且该序列的第一个值必须>=0,还有一个地方就是这是一个圆圈,即从第N个数可以回头转到第一个值,但是最多也就是转一圈,即将该序列浏览两遍,但是转到第一个值的条件是dp[n] > 0,因为只有最后一个dp值大于0的时候转到前面才有意义,试问,如果最后一个dp值小于等于0,都已经欠钱了,早就被踢出德国了……然后为了方便可以将dp[n]存在dp[0]里面……还有一个问题是浏览第一遍数组时,如果所得值已经大于n了,就没有必要继续了,给maxn直接赋值n就可以退出循环 阅读全文
posted @ 2012-08-16 22:19 Shirlies 阅读(383) 评论(0) 推荐(0) 编辑
摘要: 如果从i->j有路的话,dp[j] = max(dp[j],dp[i]+value[j]),并记录下path[j],如果选择的是dp[i]+value[j],则path[j] = i;之后回溯就可以找到所有路径了……其实这一题可以用压缩版的数组(其实一维数组啦)存储是否有路径,可以节约一半的空间(因为一个地方只有到另外一个编号比它大的城市的路),为了方便我还是用的二维数组^_^代码如下: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 int dp[105]; 6 阅读全文
posted @ 2012-08-16 20:54 Shirlies 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 不知道0ms思路是咋样的,偶滴代码15ms……就是转换成一维数组,然后求最大子序列和……代码如下: 1 #include <cstdio> 2 #include <cstring> 3 4 int n; 5 int inp[105][105]; 6 int temp[105][105]; 7 8 int get_sum(int t[]) 9 {10 int dp[105];11 12 dp[0]= t[0];13 for(int i = 1;i < n;i ++)14 {15 if(dp[i-1]>= 0)16 dp[... 阅读全文
posted @ 2012-08-15 17:35 Shirlies 阅读(166) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1078人家说是简单题,我说是神题,这个就是大大滴差距\可怜神奇的DP+记忆化搜索只要将各个方向递归退栈后得到的最大值用dp[x][y](这里的最优就是各个方向上的最大值加上此处的cheese)记录下来,以后如果再次搜索到这个地方时可以直接返回该处的值……ps一句:看了别人的题解后才弄出来的……代码如下: 1 #include <cstdio> 2 #include <cstring> 3 4 int dp[105][105]; 5 int inp[105][105]; 6 int n, 阅读全文
posted @ 2012-08-15 16:16 Shirlies 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 啥也不说,就是求最长递增子序列,就说这一题的输出,偶服了,还要分复数和单数……囧死了……代码就不贴了…… 阅读全文
posted @ 2012-08-15 00:44 Shirlies 阅读(279) 评论(0) 推荐(1) 编辑
摘要: 搞了点搜索,IDA*那个启发函数太难找了,先放一放,来搞DP,至于DP的题目是根据http://www.cppblog.com/doer-xee/archive/2009/12/05/102629.html这个地方的内容来的,很全面……这一题还比较好搞……处理当前点,看当前点可达哪一些点……代码如下: 1 #include <cstdio> 2 #include <cstring> 3 4 const int mod = 10000; 5 int map[105][105]; 6 int dp[105][105]; 7 8 int main() 9 {10 int n, 阅读全文
posted @ 2012-08-14 19:42 Shirlies 阅读(267) 评论(0) 推荐(0) 编辑
上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 21 下一页