随笔分类 - 算法
摘要:。在区间内,先单调递增再单调递减(或先单调递减再单调递增)。 1 double Trisection(double dLeft, double dRight, ...) 2 { 3 double dMid = dLeft, dMidMid = dRight; 4 5 while (dMidMid - dMid > 1e-6) 6 { 7 dMid = (dLeft + dRight) / 2; 8 dMidMid = (dMid + dRight) / 2; 9 if (Calc(dMid, ...) > Calc(dM...
阅读全文
摘要:拓扑排序-维基百科用以下的简单算法得到一个DAG的拓扑排序,而且,所有的拓扑排序都可以通过这个算法得到。设需要进行拓扑排序的图为G,已经完成拓扑排序的顶点构成序列q。开始时,置图G1=G,q为空序列;如果图G1是空图,则拓扑排序完成,算法结束,得到的序列q就是图G的一个拓扑排序;在图G1中找到一个没有入边(即入度为0)的顶点v,将v放到序列q的最后(这样的顶点v必定存在,否则图G1必定有圈;因为图G有圈,故不是DAG);从图G1中删去顶点v以及所有与顶点v相连的边e(通过将与v邻接的所有顶点的入度减1来实现),得到新的图G1,转到第二步。以上摘自维基百科以此题为例,用邻接表存储图有N个比赛队(
阅读全文
摘要:装配一辆汽车,有两条装配线分别有n个装配点,每条装配线在进出所花时间为e[i],x[i] (i=0,1),每个装配点所需时间a[i][j](i=0,1;j=0,1,...,n-1),从一条装配线i的第j个装配点到另一条装配线的第j+1个装配点所需时间t[i][j]。对于图来说(截至《算法导论》)::S1,1 处所需时间 = e1 + a1,1;S1,j(2<=j<=n)处所需时间min {到S1,j-1 所需时间 + a1,j, 到S2,j-1 所需时间 + t2,j-1 + a1,j};出口处所需时间 min {到S1,n所需时间 + x1, 到S2,n所需时间 + x2}。于是
阅读全文
摘要:给出一个矩阵链,A1A2...An。求最小的相乘运算次数。如:n*k 的 Ai 和 k*m 的A(i+1),则相乘运算次数为n*k*m。给AiA(i+1)...A加括号(1≤i≤j≤n),求最小代价,用m[i][j]来记录Ai...Aj最小的矩阵乘法运算次数,那么A1...An的最优解就是m[1][n]。当只有一个矩阵时,m[i][i] = 0 (i = 1,2...,n);当多个矩阵时,即 i<j,通过加括号来构造子结构。在Ak处把一个矩阵链划分成两个链,即Ai...Aj划分成Ai...Ak, A(k+1)...Aj(i≤k<j)。Ai...kA(k+1)...j的乘法运算次数就是p[
阅读全文
摘要:今天终于把0-1背包搞懂了,随笔记下。关于0-1背包问题的算法,资料上写得再详细不过了。阐述下问题:有n种物品,每种只有一个。第i种物品的体积为Vi,重量为Wi。选一些物品装到一个容量为C的背包,使得背包内物品在总体积不超过C的前提下重量尽可能大。1≤n≤100,1≤Vi≤C≤10000,1≤Wi≤10^6。推导出状态转移方程:f[i][j] = max(f[i-1][j], f[i-1][j-Vi]+Wi)f[i][j] 表示在放好第 i 个物品,总占用背包体积大小为 j 时,可装下最大质量 f[i][j]。如果对于 f[i][j] 和 f[i-1][j-Vi] 的关系不是很清楚,那可以想成
阅读全文
摘要:在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。输入:每行只有一个正整数N,N小于32768。输出:对应每个输入,输出兑换方法数。Sample input:293412553Sample output:71883113137761 第一种是通过递归实现:今天刚从《妙趣横生的算法》看到整数的划分数的递归算法。以下是归纳出来的递归函数式:设标记P(n, m)表示正整数n的所有不同划分中,最大加数不大于m的划分个数。 [ 1 m = 1;P(n, m) = [ P(n, n) n < m;[ 1 + P(n, n-1) n = m; [ P(n
阅读全文
摘要:http://poj.org/problem?id=3984简单bfs#define MAXN 5int n, m;int Q[MAXN*MAXN];bool vis[MAXN][MAXN];bool maze[MAXN][MAXN];int dx[4] = {-1, 0, 1, 0};int dy[4] = {0, 1, 0, -1};int dir[MAXN*MAXN];int lastDir[MAXN][MAXN];int fa[MAXN][MAXN];//int dist[MAXN][MAXN];void BFS(int x, int y);void PrintPath(int x,
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3756题目要求:点在圆锥上或在圆锥里,求符合要求的最小体积的圆锥的高和半径。解题思路:把三维中的点转化到二维(可以设想成每个点在三维中距圆锥中心的距离和高)线段上的点在圆锥曲面上,线段下的点在圆锥内部。这样,只要找到一条能把全部点包括在内的,又符合题目要求的线就行了。然后就是用三分在高的可能区域([lowHeight, highHeight])中查找#include <iostream>#include <cstdio>#include <cmath>using names
阅读全文
摘要:位操作应用——异或http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=4095Sample Input2aabcdefbzyxwvubzyxwvu4aqwertyeas fghaqwertyeasdfgheasdfghaqwertyaqwerty20x0abcd0ABCDEF0x0abcdSample Outputaabcdefeas fgh0ABCDEF题意:购买了n对袜子,每对袜子都有自己的名字(即7个字符)。丢失了一只,找出丢失的袜子的名字。首先想到的是对二维字符数组排序,这样很费空间。还有一种做法就是用异或
阅读全文
摘要:拿这题来说事:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3421ZOJ Problem Set - 3421Error Curves Time Limit: 2 Seconds Memory Limit: 65536 KB Josephina is a clever girl and addicted to Machine Learning recently. She pays much attention to a method called Linear Discriminant Analysis, which
阅读全文
摘要:背景:在一个伸手不见五指的黑夜里,有一群人过一独木桥,只有一盏灯,每次只能过两人,于是没过去两个必须回来一个人。分析:N:总人数,按所花时间从小到大排序:AB......YZ,分别对应所用时间a,b......y,z。分情况讨论:假设数据已经按以上规则排好序。N=1时,taketime=a;A - a;N=2时,taketime=b; A,B - b;N=3时,taketime=a+b+c; A,C - c; A - a; A,B - b;N=4时, 有两种模式: 模式一:taketime=2*a+y+z; A,Z - z; A -a; A,Y - y; A - a
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2754大致意思:有一堆骨牌,码好(当然不只是单线程,最初考虑单线程的,一直wa)给你 n, m, l。n表示n张骨牌(从1-n标记),m表示 (x,y)对数,x倒了,y必倒,l 表示用手推倒的牌数,对应相应骨牌的标记号码。计算有几张骨牌倒了。第一次开了10001*10001的数组来存,明显超内存了;第二次用结构体来存(x,y);218MS 324K 793 B C++ 46MS540K733 BC++ #include<stdio.h>#include<algorithm>using
阅读全文
摘要:http://acm.pku.edu.cn/JudgeOnline/problem?id=3273把N天分为M段连续区域,求M段区域中的最小最大值。其实自己还没怎么完全理解二分的实现,下面的代码是看别人写的。惭愧。#include<stdio.h>int main(){ int N,M,max,min,mid,i,k,sum,money[100001]; while(scanf("%d%d", &N, &M)!=EOF) { max=0; min=-1; for(i=1; i<=N; i++) { scanf("%d",
阅读全文
摘要:斐波那切数列.F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n=2) 每行输入一个数n和m(n = 2*10^9 ,m 10^4) 每行输出F(n)%m. 第 n 个数为:┌┐ ^n┌┐|01| 0|11 |1└ ┘└ ┘对应各元素位置:┌┐| [0] [1] || [2] [3] |└┘通过调用递归函数,计算乘积。时间复杂度:O(log2N)。代码
阅读全文
摘要:http://acm.pku.edu.cn/JudgeOnline/problem?id=3186有一些食物,放在一个两端开口的仓库里,每天只能从两端选择一端取出一件食物,并且食物的价值是随着天数逐天递增,第i天的价值 本来价值*i,求n天取出食物,使之取得最大价值;状态转移方程:dp[i][j]=max(dp[i+1][j]+t[i]*(n-j+i), dp[i][j-1]+t[j]*(n-j+i));i~j 看作 食物存放次序第 i 到 j 的一段区间i从n开始dp;
阅读全文
摘要:http://acm.pku.edu.cn/JudgeOnline/problem?id=3256题意:有k头牛,n个牧场,m条路(每条路相连两个牧场且单向),求全部牛都能到达的牧场有几个。分析:用DFS,从每头牛所在牧场开始,走遍该牛能到的牧场,对应能到达的牧场记录来过的牛数心得:原先我是对每个牧场作为起点,进行DFS,当然条件是有路并且对应牧场有牛。不过比较牧场数(n≤1000)和牛数(k≤100),实在太浪费时间了。部分代码:main()里的调用部分:for(i=1; i<=cow; i++)//对应某只牛{ memset(vis, 0, sizeof(vis));//初始化下一个
阅读全文
摘要:http://acm.pku.edu.cn/JudgeOnline/problem?id=1664还是没理解为什么这么做#include<stdio.h>int dg(int m, int n){ if(m < 0) return 0; if(m == 0 || n == 1) return 1; return dg(m-n, n) + dg(m, n-1);}int main(){ int t, m, n; while(scanf("%d", &t) != EOF) { while(t--) { scanf("%d%d", &
阅读全文
摘要:第一次完成DFShttp://acm.pku.edu.cn/JudgeOnline/problem?id=1164题目求:房间的个数和房间的最大面积。思路:为了调试看起来方便,用8表示墙,用0表示通路(当然房间区域也是可以走通的,所以也用0表示),用(2*row+1)*(2*column+1)的矩阵来表示(0 ≤ i≤ 2*row,0 ≤j≤ 2*column),当 i,j 都为奇数时,点(i , j)表示房间区域, 其余则为墙或门。心得:原先没有想到还有这种情况:3 33 2 61 0 49 8 12经过调试发现,房间区域为8了,但路上还是0,这样就会引起重复计算,对dfs()做了修改:wh
阅读全文
摘要:排列下一个字典序:从原排列后部开始,对相邻一对进行比较,若前者小于后者,标记前者下标为 j;令 k = len - 1, k 递减,寻找到 order[K ] order[j ] (k j),交换两项;对 order[ j + 1 ] 到 order[k ], 进行从小到大的排序就可以了。代码当然C++里对下一个字典排序是有STL的:不过对于STL,我的观点是:用之前必须弄明白它的原理。代码http://acm.pku.edu.cn/JudgeOnline/problem?id=1256the right order of letters is 'A''a''B''b'...'
阅读全文

浙公网安备 33010602011771号