12 2011 档案

HDU2833 WuKong Floyd
摘要:/* Floyd的应用 用Floyd求出任意两点间的最短路径 两个定理: 1.所求的路径一定是一断连续的路径 2.如果路径(x,y)是a->b的最短路径中的一段,则min(a,b) = min(a,x) + min(x,y) + min(y,b) 最后只需找到同时在两条最短路径上,且距离最长的那一段 */ #include <iostream> using namespace std; const int inf=200000000; int s[305][305];//记录最短路的长度 int num[305][305];//同样长度的最短路的最长的跳数 int main( 阅读全文

posted @ 2011-12-31 14:57 windmissing 阅读(161) 评论(0) 推荐(0) 编辑

多源最短路径 Floyd
摘要:/* Floyd.h 时间复杂库:O(N^3) 用途: 1.判断中否联通 s[a][b] != inf -> 联通 s[a][b] == inf -> 不联通 2.两点间最短路径长度 s[a][b] != inf -> 最短路径长度 = s[a][b] s[a][b] == inf -> 不联通 3.两点间的最短路径的跳数 初始化时所有路径长度设为单位长度 s[a][b] != inf -> 跳数 = s[a][b] s[a][b] == inf -> 不联通 */ #include <iostream> using namespace std; 阅读全文

posted @ 2011-12-31 14:41 windmissing 阅读(216) 评论(0) 推荐(0) 编辑

HDU3350 #define is unsafe 栈的应用
摘要://数据结构-栈的应用 #include<iostream> #include<string> #include<vector> using namespace std; struct node { int value;//值 int add;//+的次数 }; //用容器实现栈的FILO vector<node> ans;//数值栈 vector<char> sig;//符号栈 int main() { int t, i; string str; node temp, temp2; cin>>t; while(t--) 阅读全文

posted @ 2011-12-31 14:00 windmissing 阅读(125) 评论(0) 推荐(0) 编辑

搜索
摘要:HDU1254 推箱子 BFS+优先队列HDU2433 Travel BFS求最短路径树+优化HDU1401 Solitaire 双向搜索 阅读全文

posted @ 2011-12-31 13:41 windmissing 阅读(115) 评论(0) 推荐(0) 编辑

HDU1254 推箱子 BFS+优先队列
摘要:/* 箱子和人共同组成一个状态,用node来记录状态 使用优先队列,是因为只有箱子移动,记数才+1,并不是每次都+1, 从队列中选择记数最小的,进行下一步搜索 只使用优先队列不能保证结果是最小。 因为两个记数相同的状态,下一步的记数不一定相同 使用flag避免重复计算 */ #include <iostream> #include <queue> using namespace std; struct node { int ceil; int people_x,people_y; int box_x,box_y; bool operator<(const node 阅读全文

posted @ 2011-12-31 13:41 windmissing 阅读(162) 评论(0) 推荐(0) 编辑

数论-Special Numbers
摘要:1.Fibonacci Number0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377, 610 …Formula:2.Lucas Number1, 3, 4, 7, 11, 18, 29, 47, 76, 123...Formula:3.Catalan Number1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786,208012…Formula:Application:1) 将 n + 2 边形沿弦切割成 n个三角形的不同切割数2) n + 1个数相乘, 给每两个元素加上括号的不同方法 阅读全文

posted @ 2011-12-31 13:04 windmissing 阅读(204) 评论(0) 推荐(0) 编辑

HDU3524 Perfect Squares 数论
摘要:/* 还是暴力打表,然后规律 递推公式: a[n]=4*a[n-1]+5(n为奇数) a[n]=4*a[n-2]+5(n为偶数) 结果: ans=2*4^n-5*(4^n-1)/3(n为奇数) ans=2*4^n-4*(4^n-1)/3(n为偶数) 这里由于涉及到除法取余,所以还要把3的逆元求出来 */ #include<stdio.h> #include<stdlib.h> #define mod 10007 //非递归方法求p^b __int64 power(__int64 p,__int64 b) { __int64 sq=1; while(b... 阅读全文

posted @ 2011-12-31 13:03 windmissing 阅读(173) 评论(0) 推荐(0) 编辑

HDU2818 Building Block 并查集
摘要://很祼的并查集 #include "UnionFindSet.h" #include <iostream> using namespace std; int main() { UFS ufs; int P, X, Y; char ch; cin>>P; while(P--) { cin>>ch; if(ch == 'M') { cin>>X>>Y; ufs.Union(X,Y,-1); } else { cin>>X; ufs.Find(X); cout<<ufs.dept 阅读全文

posted @ 2011-12-30 15:53 windmissing 阅读(90) 评论(0) 推荐(0) 编辑

并查集
摘要:/* UnionFindSet.h 并查集,非递归方法,含路径压缩,数组从0开始 合并时,前者合并入后者,不区分大小 */ #include <iostream> using namespace std; #define MAXN 30005 class UFS { public: int n; int father[MAXN+1];//集合根结点 int rank[MAXN+1]; //集合中点的个数 int depth[MAXN+1]; //每个结点改变一次所属的集合,增加一些值 public: UFS(int size = MAXN); vo... 阅读全文

posted @ 2011-12-30 15:51 windmissing 阅读(143) 评论(0) 推荐(0) 编辑

HDU2642 Stars 二维树状数组
摘要://很纯的二维树状数组 #include "TreeArray.h" #include <iostream> using namespace std; int main() { bool flag[MAX][MAX]; TreeArray ta(2); int m,x1,x2,y1,y2; char op; while(scanf("%d",&m)!=EOF) { memset(flag, 0, sizeof(flag)); ta.clear(); while(m--) { getchar(); scanf("%c" 阅读全文

posted @ 2011-12-30 13:50 windmissing 阅读(169) 评论(0) 推荐(0) 编辑

树状数组
摘要:/* TreeArray.h 树状数组,一维和二维都有。数组必须从1开始 问题: 已知数组a[],元素个数为n,现在更改a中的元素,要求得新的a数组中i到j区间内的和 解决方法: 从图中不难发现,c[k]存储的实际上是从k开始向前数k的二进制表示中右边第一个1所代表的数字 个元素的和(这么说可能有点拗口,令lowbit为k的二进制表示中右边第一个1所代表的数字,然后 c[k]里存的就是从a[k]开始向前数lowbit个元素之和) C1 = A1 C2 = A1 + A2 C3 = A3 C4 = A1 + A2 + A3 + A4 C5 = A5 C6 = A5 + A6 C7 = A7 .. 阅读全文

posted @ 2011-12-30 13:45 windmissing 阅读(107) 评论(0) 推荐(0) 编辑

HDU2842 Chinese Rings 矩阵的应用
摘要:/* 取下前n个环步骤是先取下前n-2个环,再取下第n个环,再还原前n-2个环,最后取下前n-1个环。 递推公式:f(n) = f(n-1) + 2 * f(n-2) + 1 构造矩阵: Fn(1,3) = |f(n) f(n-1) 1| F2(1,3) = |f(2) f(1) 1| = |2 1 1| |1 1 0| A(3,3) = |2 0 0| |1 0 1| Fn = F2 * A^(n-2) */ #include "Mat.h" #include <iostream> using namespace std; int a[3][3] = {... 阅读全文

posted @ 2011-12-30 11:27 windmissing 阅读(150) 评论(0) 推荐(0) 编辑

HDU2855 Fibonacci Check-up 矩阵的应用
摘要:/* 两个数论公式: f(k) = ( (1+sqrt(5)) / 2 ) ^ k - ( (1-sqrt(5)) / 2) ^ k (1+a)^n = Sum(C(k|n) * (a^k)) 推导过程: Sum(C(k|n) * f(k)) = Sum(C(k|n) * ( (1+sqrt(5)) / 2 ) ^ k - ( (1-sqrt(5)) / 2) ^ k) = Sum(C(k|n) * (1+sqrt(5)) / 2 ) ^ k) - Sum(C(k|n) * (1-sqrt(5)) / 2 ) ^ k) = ( (3+sqrt(5)) / 2 ) ^ k - ( (3-sq.. 阅读全文

posted @ 2011-12-30 11:06 windmissing 阅读(100) 评论(0) 推荐(0) 编辑

HDU2276 Kiki & Little Kiki 2 矩阵应用
摘要:/* s[i][j]表示i秒钟后第j个灯的情况 s[i][j] = (s[i-1][j] + s[i-1][j-1]) % 2; 令 Fn(1,len) = |s[i][0] s[i][1] …… s[i][len]| F0(1,len)为输入状态 A(len len) = |1 1 | | 1 1 | | …… | |1 1| Fn = F0 * A ^ n 这题中模板会超时,要把模板中Multiply()的%放到()外面才可以 */ #include "Mat.h" #include <iostream> usin... 阅读全文

posted @ 2011-12-29 21:02 windmissing 阅读(99) 评论(0) 推荐(0) 编辑

HDU1588 Gauss Fibonacci 矩阵应用
摘要:/* 由f(n)=f(n-1)+f(n-2)构造矩阵 令 Fn(1,2) = |f(n) f(n-1)| A(2 2) = |1 1| |1 0| F1(1 2) = |1 0| Fn = F(n-1) * A = F1 * A ^ (n-1) 代入n = g(i) = k * i + b 得:Fn = F1 * A ^ (k * i + b - 1) 1)b > 1 Fn = F1 * A^(b-1) * (A^k)^i Sum(Fn) = F1 * A^(b-1) * Sum((A^k)^i) 2)b = 1 Fn = F1 * (A^k)^i Sum(Fn) = F1 * Sum( 阅读全文

posted @ 2011-12-29 20:24 windmissing 阅读(93) 评论(0) 推荐(0) 编辑

HDU2254 奥运 矩阵应用
摘要://最原始的矩阵应用,不解释 #include "Mat.h" #include <iostream> #include<map> #include<string> using namespace std; map<string, int> M; Mat mat, temp1, temp2; int main() { int n, cnt, k, t1, t2, ans, a1, a2; string p1, p2, v1, v2; mod = 2008; while(cin>>n) { mat.clear(); 阅读全文

posted @ 2011-12-29 19:38 windmissing 阅读(117) 评论(0) 推荐(0) 编辑

hdu1160最长递增子序列
摘要://1160 #include <iostream> #include <algorithm> using namespace std; struct mouse { int id; int weight; int speed; int pos; int pre; }s[10005]; bool cmp(mouse a,mouse b) { return(a.weight<b.weight||(a.weight==b.weight&&a.speed<b.speed)); } int main() { int count=0; while(sc 阅读全文

posted @ 2011-12-29 19:03 windmissing 阅读(142) 评论(0) 推荐(0) 编辑

1133catalan数二维变种
摘要:解题思路: 这个题目直接求合理的排序比较烦琐,采用模拟的方法也显然不行。可以先考虑可以实现的概率,再用实际的总次数去乘。 先把所有的n个拿50的人排好,接下来再把拿100的人插入队列。求可行的概率。 n个拿50的人有n+1个空位,除了第一个以外,其他的位置都可以,所以概率是n/n+1,在以上的基础下,第2个的的概率是n-1/n(由于是求概率,所以可以把所有的拿50或100的人看成是一样的,在这个前提下可以认为第一个拿50的人和第一个拿100的人一起消失了。为什么可以这么认为?由于在求概率,不去除的化会重复计算,具体读者自己思考)。同理直到最后一个拿100的插入队列,他成功的概率是n-m+... 阅读全文

posted @ 2011-12-29 19:02 windmissing 阅读(151) 评论(0) 推荐(0) 编辑

hdu1134大数+catalan数
摘要://hdu1134大数+catalan数 #include<iostream> #include<string> #include<iomanip> #include<algorithm> using namespace std; #define MAXN 9999 #define DLEN 4 class BigNum{ private: int a[300]; int len; public: BigNum(){len = 1;memset(a,0,sizeof(a));} BigNum(const int b); ... 阅读全文

posted @ 2011-12-29 19:02 windmissing 阅读(134) 评论(0) 推荐(0) 编辑

hdu1114 Piggy-Bank 完全背包
摘要:/*设d[k]是重量为k时所对应的最小价值,重量不可能凑成k时,置其为-1,表示无穷大状态转移方程:dp[k] = 0…………k = 0;dp[k] = min(value[j] + dp[k - weight[j]])…………k >= weight[j];其中,1=< j <= n,若dp[k - weight[j]]) = -1,表示它是无穷大,重量不能达到本题求的是最小,模板需要做一些细微的改动/*完全背包 有N种物品和一个容量为V的背包,每种物品都有无限件可用。 第i种物品的费用是c[i],价值是w[i]。 令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大 阅读全文

posted @ 2011-12-29 19:02 windmissing 阅读(132) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示