
HDU
111111用户昵称不存在00000
这个作者很懒,什么都没留下…
展开
-
HDU3032->SG函数
HDU3032->SG函数题意: 两个人玩游戏,有n堆石子,每堆个数不等,可以进行的操作是从任一堆中取任意颗石子,或者把这堆石子分成两堆。 给出一个初始的局面,判断先手胜还是后手胜。题解: sg(n)代表从当前状态到游戏结束最多需要多少步当有n堆石子时,游戏相当于一个组合博弈,当前的sg值就是每堆石子的sg值异或的结果。 对于任意的一个 Anti-SG 游戏,如果我们规定当局面中所原创 2016-08-28 18:27:57 · 625 阅读 · 0 评论 -
HDU1024->线性DP
HDU1024->线性DP题意: 求一个有n个元素的序列,划分出m个子序列,求这m个子序列的最大和。题解: dp[i][j]代表前j个数选i个子序列,能得到的最大和。 决策为:第j个数,是在第包含在第i组里面,还是自己独立成组。 状态转移方程: dp[i][j]=max(dp[i][j-1]+num[j],dp[i-1][k]+num[j]) ; 由于采用二维数组,原创 2016-08-18 12:44:22 · 360 阅读 · 0 评论 -
HDU1700->向量旋转
HDU1700->向量旋转题意: 一个圆的圆心在(0,0),已知圆上一点,求另外两点使得这三点构成的圆内接三角形周长最大。题解: 圆的内接三角形中,周长最大的为正三角形。 已知一点即知道了圆的半径,和一个圆心与该点构成的向量,旋转这个向量即可得到另外两个点。代码:#include <stdio.h>#include <iostream>#include <cmath>usin原创 2016-08-27 23:40:30 · 573 阅读 · 0 评论 -
HDU5094->BFS&&状态压缩
HDU5094->BFS&&状态压缩题意: 有一个迷宫,每个格子有四个方向,但这四个方向可能是门,可能是墙,也可能是通路,有些格子里有钥匙,每种钥匙只能开对应品种的门,求从(1,1)到(n,m)所花费的最少时间题解: 相比最基本的迷宫,这个题多了许多状态,因此我们在记录迷宫信息时不能再简单的只记录一张图,而是要记录每个格子的四个方向的状态以及每个格子有没有钥匙,有哪些钥匙。 在记录钥原创 2016-08-17 15:40:47 · 663 阅读 · 0 评论 -
最小生成树Prime->HDU1875
最小生成树Prime->HDU1875生成树: 无向图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树。若在生成树中任意增加一条边,将出现回路;减少一条边,则会使之成为非连通图。最小生成树(最小代价生成树): 对无向连通图的生成树,各边总和称为生成树的权,权最小的生成树称为最小生成树。最小生成树的Prime算法: Prime算法采用贪心的思想,先将图中的第一个节点加原创 2016-08-04 22:48:36 · 353 阅读 · 0 评论 -
HDU1536->SG函数
HDU1536->SG函数题意: 给出n堆石子,每次只能按照规定的取石子个数取,输出先手的胜负情况。题解: 递归求出sg函数就能解决问题。代码:#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>using namespace std ;int s[110] , sg[10010原创 2016-08-29 14:52:11 · 451 阅读 · 0 评论 -
HDU1730->Nim博弈
HDU1730->Nim博弈题意: 游戏在一个n行m列(1 ≤ n ≤ 1000且2 ≤ m ≤ 100)的棋盘上进行,每行有一个黑子(黑方)和一个白子(白方)。执黑的一方先行,每次玩家可以移动己方的任何一枚棋子到同一行的任何一个空格上,当然这过程中不许越过该行的敌方棋子。双方轮流移动,直到某一方无法行动为止,移动最后一步的玩家获胜。 判断先手的胜负情况。题解: 等效于nim博弈。原创 2016-08-29 15:34:03 · 568 阅读 · 0 评论 -
凸包Graham扫描法->HDU3847
Graham扫描法求凸包凸包定义: 点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内。 凸包最常用的凸包算法是Graham扫描法和Jarvis步进法。 Graham扫描法: 首先,找到所有点中最左边的(y坐标最小的),如果y坐标相同,找x坐标最小的. 以这个点为基准求所有点的极角(atan2(y-y0,x-x0)),并按照极角原创 2016-08-30 00:29:27 · 638 阅读 · 0 评论 -
HDU4791->贪心&&二分优化
HDU4791->贪心&&二分优化题意: 有一家打印店,打印超过一定分数后每份的单价就会降低,你需要打印一些文件,你可以打印敲好的份数或者是多打印一些废纸以凑得更低的价格,问打印这些文件所需的最小花费。题解: 采用贪心策略,从最单价低价开始计算,直到计算到数量的区间正好包含所需印刷的产品数量。 但是单纯采取贪心策略遍历整个价格数组会TLE,所以需要二分优化,先二分找到包含当前价格的价原创 2016-10-07 21:47:19 · 443 阅读 · 0 评论 -
HDU5884->贪心
HDU5884->贪心(二分+单调队列)题意: n个有序序列的归并排序。每次可以选择不超过k个序列进行合并,合并代价为这些序列的权值和(类似果子合并).总的合并代价不能超过T, 问k最小是多少题解: 贪心算法求解。 二分答案k,k可以从2取到n,由于每次将k个元素归并成了一个元素,也就是说归并一次序列长度减少了(k-1),最后要把n个序列归并成1个序列,相当于一共要减少的长度为(n-原创 2016-09-20 18:54:29 · 532 阅读 · 0 评论 -
分治法求两点间最短距离->HDU5721
分治法求最近点对的距离:主要思想就是先把n个点按x坐标排序,然后求左边n/2个和右边n/2个的最近距离,最后合并。合并过程: 首先,假设点是n个,编号为1到n。我们要分治求,则找一个中间的编号m,先求出1到m点的最近距离设为d1,还有m+1到n的最近距离设为d2。这里的点需要按x坐标的顺序排好,并且假设这些点中,没有2点在同一个位置。(若有,则直接最小距离为0了)。 然后,令d为d1,原创 2016-08-27 00:25:44 · 4721 阅读 · 0 评论 -
Nim博弈->HDU1907
Nim博弈->HDU1907Nim博弈介绍:1.有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。这种情况最有意思,它与二进制有密切关系,我们用(a,b,c)表示某种局势,首先(0,0,0)显然是奇异局势,无论谁面对奇异局势,都必然失败。第二种奇异局势是(0,n,n),只要与对手拿走一样多的物品,最后都将导致(0,0,0)。仔细分析一下,(1,2,3原创 2016-08-22 21:36:18 · 541 阅读 · 0 评论 -
威佐夫博弈->HDU1527
威佐夫博弈->HDU1527威佐夫博弈(Wythoff Game): 有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。这种情况下是颇为复杂的。我们用(ak,bk)(ak ≤ bk ,k=0,1,2,…,n)表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0,0)、(原创 2016-08-21 12:59:49 · 373 阅读 · 0 评论 -
HDU1525->博弈论
HDU1525->博弈论题意: 两个人玩游戏,给出两个数字,每个人只能用大的数字减去小的数字的任意正整数倍,先把一个数减到0的人获胜,问谁最后获胜。题解: 记a > b, 如果输入中a和b中有一个是0,则先手直接获胜。 否则: 如果a%b == 0 , 则此时正在操作的人可以直接获胜; 如果a/b>=2,则此时正在玩游戏的人可以通过自己的操作决定必胜和必败。原创 2016-08-20 17:07:01 · 581 阅读 · 0 评论 -
HDU5091->线段树维护区间覆盖次数&&扫描线
HDU5091->线段树维护区间覆盖次数&&扫描线题意: 一个平面上有一些点,给出这些点的坐标,求用一个宽为w高为h的格子最多能包含到多少个点题解: 用一根平行于y轴的扫描线维护沿x轴方向的宽度,而沿y轴方向的点的个数的计算则可以等价为求一个区间内线段覆盖的最多次数。 由于已经给出高度h,所以每个点都可以看成是以这个点的y坐标为起始,长度为h的一条线段。 这里扫描线的运用,就是原创 2016-08-20 12:14:45 · 1038 阅读 · 0 评论 -
最短路&&优先队列优化->HDU2544
最短路&&优先队列优化->HDU2544Dijkstra算法思想: (1)在任意时刻,我们都要得到从源点到所有顶点的估算距离,并维持一个顶点集合S,若顶点v在S中,则说明从源点到v的最短路径已知; (2)在每一次将不在S中的顶点v加到S中去时,总是选择从源点到v的估算距离最小的; (3)顶点v加入S中之后,对于所有与v相邻的顶点(不属于S),更新它们的估算距原创 2016-08-09 00:43:39 · 713 阅读 · 0 评论 -
HDU1075->Trie树
HDU1075->Trie树题意: 给一个单词字典,要求翻译一段话。题解: Trie树维护的信息为外来词汇,每个单词的叶子节点储存对照的翻译。代码:#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>using namespace std ;#define MAX 3005cha原创 2016-07-30 12:15:08 · 295 阅读 · 0 评论 -
Trie树介绍与动态构造->HDU1251
Trie树介绍:Trie树,称为单词前缀树,字典树,是一种用于快速检索的多叉树结构核心思想: 空间换时间,利用字符串的公共前缀来最大限度地减少无所谓的字符串比较,从而降低时间复杂度。基本性质: 1.根节点不包含字符,除根节点外的每条边对应一个字符 2.从根节点到某一个节点,将边上的字符连起来,会得到该节点对应的前缀 3.每个节点对应的前缀都不相同Trie树的编程实现1原创 2016-07-29 16:19:53 · 327 阅读 · 0 评论 -
HDU3308->线段树区间合并
线段树成段更新题意:给定一些数,有两种操作,更新替换某个数值以及查询一个区间内最长连续递增子串的长度题解: 由于题目给出数据范围很大,所以用线段树进行操作。 线段树需要维护的信息: 每个区间的最长递增子串的长度、以该区间的左边界为起点的最长连续子串的长度、以该区间右边界为终点的最长子串的长度。这里主要说明一下pushup(),其余函数操作比较常规,不做说明。 pushup()函原创 2016-07-27 14:40:14 · 415 阅读 · 0 评论 -
HDU3555->数位DP
//数位DP//从最高位开始向下DP #include #include #include using namespace std ; int bit[40] ; long long dp[40][3] ;//dp[len][0] 代表数字长度为len不含49的个数//dp[len][1] 代表数字长度为len不含49但是以9开头的个数(显然dp[len][1]包含在dp[l原创 2016-07-12 20:51:23 · 358 阅读 · 0 评论 -
HDU1215——数论解法
题意:给出一个正整数n,求出不包含它本身的所有因子的和思路:运用算术基本定理对这个这个整数进行拆分整数约数和公式即,sum = (1+p1+p1^2+...+p1^a1)(1+p2+p2^2+...p2^a2)...(1+pk+pk^2+...pk^ak)(注:该公式计算结果包含整数本身)#include #include #include using nam原创 2016-07-13 11:17:32 · 656 阅读 · 0 评论 -
HDU3653->数位DP
//数位DP//判断1-n中有多少个数字含有13且是13的倍数#include#include#includeusing namespace std ;int n ;int len ;int bit[20] ;int dp[20][20][3] ;//dp[pos][mod][st]//pos:数位//mod:余数//st: st==0末尾不是1// st=原创 2016-07-12 11:35:18 · 525 阅读 · 0 评论 -
HDU2089->数位DP
//dp[i][0]:第i位没有不吉利数字的个数//dp[i][1]:第i位没有不吉利数字但最高位数字为2//dp[i][2]:第i位有不吉利数字#include#include#includeusing namespace std ;int m , t ;int dp[10][3] ;int num[10] ;void Init(){ memset(dp, 0 ,原创 2016-07-11 23:29:46 · 425 阅读 · 0 评论 -
HDU1520->树形DP
//树形DP//没有上司的舞会//树形DP先确定各个子树,再递归返回根,整个过程相当于树的后序遍历//本题用vetor模拟树的父子关系//vector[i]里存放以i为父节点的所有子节点//状态转移方程://如果该节点不选:dp[root][0] += max(dp[tree[root][i]][1],dp[tree[root][i]][0]);//如果选取该节点:dp[root][原创 2016-07-10 11:21:59 · 404 阅读 · 0 评论 -
HDU4430->二分&&枚举
题意:按照每一圈的蜡烛数量为k^i(1题解:这是一道二分的题目,在求解过程中,先可以根据等比数列求和公式以及数据范围得出,蜡烛最多有40圈,所以求解r*k的最优解可以通过从2到40枚举半径r,并通过半径r去二分计算该半径下,如果存在蜡烛根数的解,那么解k是多少。#include #include using namespace std ;long long tot ;long lo原创 2016-07-26 01:19:15 · 411 阅读 · 0 评论 -
HDU4349->Lucas定理
Lucas定理:A、B是非负整数,p是质数。AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]。则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0]) modp同余即:Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p)原创 2016-07-25 01:17:16 · 411 阅读 · 0 评论 -
HDU4497GCD and LCM ——算数基本定理
如果G%L != 0,说明一定无解。把K = G / L质数分解,G / L = p1^t1 * p2^t2 * p3^t3 * ……;同时 x/= L, y/= L, z/=L,不影响结果。假设三个数字的质数分解是:x = p1^i1 * p2^i2 * p3^i3 * ……y = p1^j1 * p2^j2 * p3^j3 * ……z = p1^原创 2016-07-13 16:22:04 · 379 阅读 · 0 评论 -
HDU1506->单调栈
题意:求连续区间内矩形覆盖的最大面积,连续区间内矩形宽度都为1 , 高度只能取最小高度题解:维护一个单调递减的单调栈对于一个新的元素:(1)如果此时栈为空或者栈顶元素比新元素小,则将该元素入栈;(2)如果栈顶元素与新元素相等,则跳过新元素;(3)如果栈顶元素比新元素大,那么此时需要更新栈顶元素并更新面积,一直到栈顶元素小于新元素为止。#include#include原创 2016-07-24 19:58:44 · 353 阅读 · 0 评论 -
POJ5115->区间DP
//区间DP//DP[i][j]表示杀死(i,j)区间的狼能受到的最小伤害//区间长度从1开始扩大//状态转移方程:边界:DP[i][i] = a[i] + b[i-1] + b [i+1] ;// 其他:DP[i][j] = min(DP[i][k-1] + a[k] + DP[k+1][j] ) + b[i-1] + b [j+1] ;//k表示区原创 2016-07-09 17:18:07 · 320 阅读 · 0 评论