上一页 1 2 3 4 5 6 7 8 9 ··· 34 下一页
摘要: 矩阵,学过线性代数的都知道,矩阵满足结合律,但不满足交换律关于矩阵,有很多经典的应用,可以看下大牛的博客http://www.matrix67.com/blog/archives/276下面的题目中,最常见的一种应用就是利用矩阵求递推式,可以通过构造矩阵求幂在这方面,最常见的就是在斐波那契数列方面,可以看下这个博客,超牛的http://www.cnblogs.com/Knuth/archive/2009/09/04/1559951.html 很容易构造出关于斐波那契的矩阵,累乘求幂,就可以求出斐波那契的对应的项直接开始题目吧hdu1575 Tr A题目,直接矩阵求幂,再求该矩阵的迹,注意,利用 阅读全文
posted @ 2012-03-27 19:46 枕边梦 阅读(6061) 评论(4) 推荐(8) 编辑
摘要: hdu1688题意:找出从S到F两个点之间的最短路和比最短路长1的次短路的条数之和。分析:最短路很好求,关键是次短路,郁闷呀不过,如果对最短路的更新距离的过程有更深的认识的话,就好办很多了。用一个二维数组记录每一个节点距离起始点的最短距离和次短距离,再开一个二维数组记录路径数更新状态时:1)新值小于最短路径长:更新最短路径长,计数;次短路径长,计数2)新值等于最短路径长:更新最短路径计数3)新值大于最短路径长,小于次短路径长:更新次短路径长,计数4)新值等于次短路径长:更新次短路径计数View Code #include<iostream>#include<algorithm 阅读全文
posted @ 2012-03-23 21:50 枕边梦 阅读(573) 评论(0) 推荐(0) 编辑
摘要: 先求一遍最短路,再根据求出来的每一个点到达终点的最短距离,dfs计数View Code #include<iostream>#include<algorithm>using namespace std;const int N =1001;int g[N][N],n,m,dist[N];int ans,dp[N];bool vis[N];void init(){ for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) g[i][j]=INT_MAX;}void Dijkstra(int s){ memset(vis,... 阅读全文
posted @ 2012-03-21 16:03 枕边梦 阅读(161) 评论(0) 推荐(0) 编辑
摘要: Problem Description给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。Input输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。(1<n<=1000, 0<m<100000, s != t)Output输出 一行有两个数, 最短距离及其花费。分析:每条路径增加 了一个权值,但还是一道最短路的问题,只需要在更新距离的时候判断一下 阅读全文
posted @ 2012-03-21 14:39 枕边梦 阅读(501) 评论(0) 推荐(0) 编辑
摘要: CandyTime Limit:1000MSMemory Limit:65535KBDescription:Solo和koko是两兄弟,妈妈给了他们一大袋糖,每块糖上都有自己的重量。现在他们想要将这些糖分成两堆。分糖的任务当然落到了大哥Solo的身上,然而koko要求必须两个人获得的糖的总重量“相等”(根据Koko的逻辑),要不然就会哭的。非常不幸的是,koko还非常小,并且他只会先将两个数转成二进制再进行加法,而且总会忘记进位。如当12(1100)加5(101)时: 1100+ 0101------ 1001 于是koko得到的计算结果是9(1001)。此外还有一些例子:5 + 4 = 17 阅读全文
posted @ 2012-03-16 14:58 枕边梦 阅读(1106) 评论(0) 推荐(0) 编辑
摘要: 关于稳定婚配,下面的博客写得很错,思路很好理解http://www.cppblog.com/goal00001111/archive/2010/04/14/112525.html模板View Code #include <iostream>using namespace std;const int MAX = 4;int main(){ int libMan[MAX][MAX] = {{2, 1, 3, 0}, {0, 2, 3, 1}, {2, 3, 1, 0}, {1, 3, 2, 0}}; //存储男士所喜欢的女士序号的排列表 int libLady[MAX][MAX+1] 阅读全文
posted @ 2012-03-14 16:51 枕边梦 阅读(293) 评论(0) 推荐(0) 编辑
摘要: hdu1530 Maximum Clique题意:给定一个无向图,求最大团数分析:求最大团,也就是求一个最大的完全子图,只能靠搜索了,用一个dp数组剪枝搜索思路倒是很清晰一般思路:枚举每一个点,假设选择了这个点,那么最大团组成的集合就可能是由与这个点关联的点的集合组成,接下来就是深搜选择这个集合里面的点的过程了。剪枝:1)重新排列了访问的顺序,按度数大的先访问2)用一个dp[]数组,dp[i]表示i到n-1范围内的点组成的最大团数,那么dp[i-1] 的最大可能值就是 dp[i]+1了,这个可以在搜索过程用来剪枝悲剧,怎么改都是1000+msView Code #include<iost 阅读全文
posted @ 2012-03-08 23:27 枕边梦 阅读(556) 评论(0) 推荐(0) 编辑
摘要: 题意:将一个给定的数删除m位,求剩下的数的最小值分析:用RMQ,假设原来数字的长度为n,每次从一个区间里面取出一个最小值,取n-m即可View Code #include<iostream>#include<algorithm>#include<string.h>#include<math.h>using namespace std;int n,dp[1010][20];char B[1010];void init_RMQ(){ memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) dp[i][0]=i 阅读全文
posted @ 2012-03-08 11:28 枕边梦 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 题意跟hdu1520一样,给定一棵树,要求选出若干个点,但如果选择了父节点跟儿子节点不可以同时选。。求可以选出的节点数的最大值,同时,判断该选法是否唯一;分析:前半部分很容易实现,普通的树形dp,关键是如何判断是否唯一。我们用flag[N][2]来记录每一个节点的情况flag[i][j]为真,表示唯一则可以这样判断对于叶子结点, flag[k][0] = flag[k][1] = 1.对于非叶子结点,对于i的任一儿子j,若(dp[j][0] > dp[j][1] 且 flag[j][0] == 0) 或 (dp[j][0] < dp[j][1] 且 flag[j][1] == 0) 阅读全文
posted @ 2012-03-07 23:12 枕边梦 阅读(332) 评论(0) 推荐(0) 编辑
摘要: 题意:给定N个国家,相互之间可能存在附属关系,现在想要贿赂m个国家,已知,贿赂一个国家,那么如果该国家拥有附属国,那么他的所有附属国都可以算作已经贿赂。分析:按照国家之间的附属关系连边(有向),之后将森林转为一棵树,就变成了一棵树上的01背包了。因为国家是用名字给出的,先用字典树给名字编号……dp[i][j]表示第i个国家及其附属国中选j个国家的最小花费之前一直过不了的题,现在居然1A了,主要是思路比较清晰View Code #include<iostream>#include<algorithm>#include<string.h>#include< 阅读全文
posted @ 2012-03-07 21:37 枕边梦 阅读(508) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 ··· 34 下一页