C++获取系统时间方法(毫秒级) #include long getCurrentTime(){ struct timeval tv; gettimeofday(&tv,NULL); return tv.tv_sec * 1000 + tv.tv_usec / 1000;}
poj2185(二维最小覆盖子串问题-KMP) 题意:给出一个二维的字符矩阵,问最小的可覆盖子矩阵大小。解法:如果是一维的话,在KMP算法的Next数组中,len-Next[len]是一维的覆盖子串,如果len-Next[len]能整除len,则可恰好覆盖(即长度为len-Next[len]的前缀)。 在二维的情况,每行每列求一个最小公倍数就可以了,并且公倍数不能大于本身总长度。代码:/*****
poj2482(最多矩形覆盖-线段树) 题意:二维平面上有一些星星,每个星星都有一个亮度值,给一个矩形,矩形两边平行于坐标轴,只能平移不可以旋转,问矩形覆盖面积内的星星的亮度值之和最大是多少?解法:将模型转化为:每个星星都是一个相等大小的矩形的中央。每个星星都是一个矩形,这时候求一个点,使得所有覆盖此点的矩形的亮度值之和最大。 解此模型可以用线段树,先将区间离散化,然后从左向右扫,及时维护和查询。 ps:做题过
求一条直线上能包含的最多数量的点 题目大意:给N个二维点的坐标,求在所有点的连线中一条直线所能包含最多的点的个数;2000ms,1000的复杂度刚开始自己想了个N^3复杂度的方法,即使加上了感觉很有效的剪枝,但是依然TLE了。看了网上某ACMer的博客,恍然大悟,原来N^2logN就可以过了;大致思路:枚举每一个点:计算其他所有点和此点连线的斜率,然后将斜率排序。此时,便可以在排好序的斜率中将相等的斜率数量找出来(
并查集加最小堆实现的Kruskal算法… 容易证明的是,在图的最小生成树中,它的最长边在所有生成树的最长边中也是最短的,所以求所有生成树的最长边的最小值的问题和最小生成树是一个问题。下边是并查集加最小排队实现的Kruskal算法。稍微修改下输入格式,在poj上连过了好几道最小生成树的题目。大致思想:a:不断的找到最小边,判断此边的两点是否已经连通,若连通则不作为并继续在堆上pop(直到pop出的边的两点所属集合不连通),若不连通
匹配子轨迹 #include #include #include #include #include #include #include #include #include using namespace std;const int Max = 1000;const double coe = 0.01;const double INF = 1e10;struct point{
相似度(参数调节代码) // test1.cpp : Defines the entry point for the console application.//#include #include #include #include #include #include #include #include #include #include #include #include #include
计算轨迹相似度代码 // test1.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include #include #include #include #include #include #include #include #include #include
四子棋 #include #include #include #include #include #include #include #include #include #include #include using namespace std;int move[4][2]={ 0,1, 0,-1, 1,0, -1,0};const int M
正则匹配 bool isMatch(string s,string format){ if(s.size()==0) { return format==""||format=="*"; } if(format.size()&&s=="") { return false; } if(s[0]==format[0]||fo
321. Create Maximum Number(贪心) Create Maximum NumberGiven two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum number of length k from digits of the two. The relative order of the dig
poj 1986(离线查询点对最近公共祖先) 题意:给一棵树,查询一些点对的距离解法:随便找一个点建立有根树,然后转化为求点对最近公共祖先问题。两点的距离等于他们与最近祖先的距离和。查询的方法是dfs+并查集离线查询。思想是,dfs过的为回溯的点的parent全部指向自己本身,vis标记为true。回溯之后的点parent指向自己的父亲。然后dfs每进入一个点,就处理这个点相关的查询,如果其中某个查询另一个点v的vis为true,
vim配置(.vimrc) set nocompatible " be iMproved, requiredfiletype off " required"set the runtime path to include Vundle and initializeset rtp+=~/.vim/bundle/Vundle.vimcall vun
监督学习(机器学习) 一、引言 本材料参考Andrew Ng大神的机器学习课程 http://cs229.stanford.edu,以及斯坦福无监督学习UFLDL tutorial http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial 机器学习中的回归问题属于有监督学习的范畴。回归问题的目标是给定D维输入变量x,并且每一个输入矢量x都有对应的
hihocoder1033(数位dp) 题目:/******************************************************* @author:xiefubao*******************************************************/#pragma comment(linker, "/STACK:102400000,102400000")#include #
hihocoder1170(状压dp) 题意:小冰的N个机器人兄弟排成一列,每个机器人有一个颜色。现在小冰想让同一颜色的机器人聚在一起,即任意两个同颜色的机器人之间没有其他颜色的的机器人。假设任意相邻的两个机器人可以交换位置,最少需要多少次交换?N解法:一个明显的结论是:交换机器人时,相同颜色的机器人不会发生交换(保持他们之间的相对顺序)。即相当于给16种排序颜色。这总共有16!种结果,其dp方法雷同于旅行商问题的方法。
poj2411(状态转移,dfs搜索转移) 题目链接题意:用1*2的小矩形拼成n*m(n,m解法:状态压缩,dfs求转移。当前一列的状态确定后,后一列必须用横向的矩形来填补前一列的空白格,所以前一列不为空时,这一列可以选择也为空让下一列来填补,或是本列来个纵向的矩形填补(如果有连续的两个空格的话)。代码:/**********************************************
hdu 5136(dp计数) 题目链接题意:直径为K的每个点的边数不超过3的相互不同构的树有多少种?解法:把树的直径拉开,两边就是两棵二叉树了。子问题:一个深度为m的不同构的二叉树有多少种?dp[i]表示深度为i的个数。sum[i]表示dp的前缀和。转移方程就是:dp[i+1]=dp[i]*sum[i-1]+dp[i]+dp[i]*(dp[i]-1)/2;然后回到原问题:如果K是偶数(想象中间有个虚
poj1482(隐式图求最短路) 题目链接题意:补丁在修正bug时,有时也会引入新的bug。假定有n个潜在的bug m个补丁,每个补丁用两个长度为n的字符串表示,其中字符串的每个位置表示一个bug,第一个串表示打补丁之前的状态('-'表示该bug必须不存在,’+‘表示必须存在,0表示无所谓,第二个串表示打补丁之后的状态(-'表示不存在,’+‘表示存在,0表示不变)。每个补丁都有一个执行时间,你的任务使用最少的时间把一个
poj2983(差分约束系统) 题目链接:http://poj.org/problem?id=2983题意:一天南北线上有n个防御站,给出他们之间的位置关系,问有没有可能存在这样一种位置布置符合所给的位置关系。关系有两种,一种是 P A B X,表示A在B北边X光年的位置,V A B表示A在B北边至少1光年位置。解法:查分约束。dist[A]-dist[B]>=X,表示A在B北边至少X光年位置。变形为:d
uva1627(模型转换01背包) 题意:有n(n解法:如果两人不是相互都认识,就连一条无向边。所以就变成了一个无向图。对于每一个连通分量来说,必须是个二分染色图,否则就No solution。然后对于每个联通分量,黑白两种颜色有个数量差,用所有的差来进行01背包,找到距离集合差0最小的方案。代码:/******************************************************
poj1160(区间DP) 题目链接:http://poj.org/problem?id=1160题意:一个公路上有n个村庄,要在一些村装建m个邮寄站,邮寄站必须建在村庄上,通过合理的选择m个建造地点,使得每个村到自己最近的邮寄站的距离和最小。解法:这个要想到,对于i-j区间建一个邮寄站,最优方案是建在中间的村庄。那么可以预处理所有的cost[i][j]表示i-j建一个站的最小距离和。dp[i][j]表示前i
hdu5117(数学推导+dp) 题意:有n(n解法:假设一种情况是开灯数是X, X=(x1+x2+x3...xn),xi是第i个灯的开闭情况。则X^3=(x1+x2+x3...xn)*(x1+x2+x3...xn)*(x1+x2+x3...xn)。即求三个灯的三三组合Xi*Xj*Xk,只有Xi,Xj,Xk都为1时候,他们的乘积才是1. dp[i][j][k][state]表示三个灯ijk状态为stat
uva437(经典DAG题目) 题意:有n(n解法:其中每种立方体有三种摆放方式,可以将每种转化成三种立方体,因为一个立方体不可能在一个相同的自己上面,所有每种一个就够了。90个点,并且是有向无环的图,求最长路径,可以拓扑排序,也可以dfs。代码:/******************************************************* @author:xiefubao*****
uva1608(Non-boring sequences) 题意:如果一个序列的任意连续子序列中至少有一个只出现一次的元素,则称这个序列是不无聊的。判断一个长度为n(n<=200000)的序列是不是无聊的。解法:搞个map记录每个数前一个数的位置,判断以每个数结尾的所有区间是否合法,其中用到线段树访问区间最小值。代码:/*******************************************************
poj1655(树的重心) 题意: 求树的重心;重心定义:以此节点为根的最大子树节点个数最小。解法:dfs代码:/******************************************************* @author:xiefubao*******************************************************/#pragma commen
poj3557(概率dp) 题意:给定n,p;表示n个点中任意两点连边的概率为p,求生成的图是个连通块的概率。n解法:反向思考,ans[i]为i个节点为连通块的概率,求ans[n]时候,求不为一个连通块的概率,然后用1减。求非连通时,枚举与1号节点为一个连通块的点的个数即可。公式:ans[i]=1.0- sigma C[i-1][j-1]*ans[j]*pow(1.0-p,j*(i-j)) --- j f
zoj1283(LIS) 题意:宝藏在一些点中,只能从(0,0)出发,每次只能向右(x+1,y)或是向上走(x,y+1)。问要走几趟才能取完宝藏。解法:按x,y分别为第一二关键字排序,那么一趟下来,y坐标是个非递减序列。然后转化成问y方向能由最少为多少的非递减序列个数组成。这个等效于求严格递减序列的长度。即nlogn求最长严格递减序列长度即可。代码:/************************
URAL 1486(二维字符串hash) 题意:一个最大500*500的字符矩阵,求最大的两个相同的字符正方形。正方形可以有重叠部分但不能重合。解法:首先是二分正方形的长度,然后判断某个长度存在时候计算字符矩阵的二维hash值,二维hash的方法是:这样子拓展的hash算法可以O(1) 获取任意一个子矩阵的hash值。代码:/*********************************
hdu1695(莫比乌斯)或欧拉函数+容斥 题意:求1-b和1-d之内各选一个数组成数对,问最大公约数为k的数对有多少个,数对是有序的。(b,d,k解法1: 这个可以简化成1-b/k 和1-d/k 的互质有序数对的个数。假设b=b/k,d=d/k,b1-tool中含有rem位置之后的i的质因子的数的个数。在for(int j=rem;jfactor[i][0];j++) ans+=tool/factor[i]
poj1201(二分+线段树)或(差分约束系统) 题意:数轴上每个位置为0或是1,给n(1 个区间[ai, bi],每个区间内至少有 ci 个1.0 1 。问数轴上至少有多少个1可以满足要求。解法1:现将区间按右端点排序,然后每个区间内的点尽量往右边放,这样子可以照顾到以后的。在找每个区间的放法时,线段树查询区间1的个数,二分查找要放的后缀位置,然后将整个区间后缀全部涂上1.总复杂度是nlognlogn。网上没找到有人这么做的,但
hdu4747 mex 线段树 题意:给一个序列不超过200000个元素,定义mex(i,j)是区间[i,j]之间所没有的最小非负整数。求sum(mex[i,j])对于所有1解法:线段树。先求出mex(1,1),mex(1,2),mex(1,3)...mex(1,n) 而且这必然是递增的。 然后 sum[i=1,1sum[i=2,2sum(mex[1代码:/************************
486E - LIS of Sequence(LIS) 题意:给一个长度为n的序列,问每个数关于序列的LIS(longest increasing sequence)是什么角色。这里分了三种: 1、此数没有出现在任意一条LIS中 2、此数出现在至少一条但是不是全部的LIS中 3、此数出现在所有的LIS中解法:nlgn的LIS算法可以求出以每个i位置结束的LIS长度up[i]。出现在L
hdu4416 Good Article Good sentence (后缀数组) 题意:问a串中有多少种字符串集合B中没有的连续子串。a的长度10^5,B中的总长度为不超过10^5.解法:后缀数组题目;后缀数组可以很容易算出来一个串中有多少种子串。把a和B集合连起来,求一次不同子串数量,然后减掉B相互连起来的数量。在求时候,要减掉含有链接符的子串,方法是扫一遍,枚举最后出现的连接符。代码:/********************************
zoj3734 题意:一棵有根树,每个节点都有一个value值和属性(LICK或是 CANDLE)。你可以通过反转一些点的属性,反转一个点时候,它的整个子树都会被反转属性。有些点反转消耗代价为X,有些为Y。你的目标的是使得LICK的value和最大。解法:13年长沙区域赛一道题,感情当时都没有做到这道题。状态ans[i][0/1]分别表示此点的子树LICK最多能比CANDLE多多少和少多少的值。状态转移见代码
uva 1378 - A Funny Stone Game sg博弈 题意:David 玩一个石子游戏。游戏中,有n堆石子,被编号为0..n-1。两名玩家轮流取石子。 每一轮游戏,每名玩家选取3堆石子i,j,k(i解法:看上去是将石子都往右移,直到所有都到了n-1堆不能移为止。首先是考虑每堆石子其实是独立的一个子游戏,堆与堆之间不相互影响。然后就是个数是偶数的对不会影响必胜必败态,必败态无法通过移动偶数堆得石子来扭转局面,因为必胜者只需对称操作即可。所以每堆石子
hdu3685(几何重心与凸包结合) 题意:给一个多边形(有可能是凹多边形)。问有多少种能够使得它稳定放置的方式。当然稳定的原则就是重心做垂线在支撑点之内。解法:因为有可能是凹多边形,所以先求出多边形的凸包,这是在放置时候会接触地面的所有点。然后将重心与每天凸边判断是否稳定;代码:/******************************************************* @author:
hdu3689(kmp+dp) 题意:问随机生成一个长度为m(m解法:dp+kmp优化。ans[i][j]表示i长度,走到了s的j位置的概率,当然这是在i之前没有出现s的前提下(在状态转移时候已经保证了这一点);然后最后的概率就是1-m长度的串分别最后出现s的概率之和。代码:/******************************************************* @author:xief
hdu5044(二分) 题意:一个树上建两个加油站,使得所有点到达其最近加油站的最大距离最小。解法:二分答案。关键时二分时候,要最合理话布局两个点的位置,做法是处理出来树的直径,然后在直径两端分别向中间移动二分的x步的两个点布下加油站。贪心可以证明正确性;代码:/******************************************************* @author:xiefuba
javascript实现贪吃蛇 body{ background:#444;}.rect{ border:1px solid #94F; width:680px; height:680px;}.gridred{width:38px;height:38px;background:red;border:1px #555 solid;float:left}.gridgreen{width:38p
hdu4848 剪枝暴力搜索。代码:/******************************************************* @author:xiefubao*******************************************************/#pragma comment(linker, "/STACK:102400000,102400000"
FZU 2144(几何+贪心区间覆盖) 题意:三维空间给出n个蚊子的初始位置(ax,ay,az)和移动趋势(dx,dy,dz),那么每个蚊子坐标随时间变化的函数就是(ax+dx*t, ay+dy*t, ax+dz*t)。每次射杀一枪,可以把距离原点距离len之内的蚊子全部杀死。问最多能射杀几只蚊子,这时至少要射杀几次?解法:先求出每只蚊子在射程之内的时间区间,即(ax+dx*t, ay+dy*t, ax+dz*t)^
CF 96D Volleyball(最短路套最短路) 题目链接:http://codeforces.com/contest/96/problem/D题意:不超过1000个点和1000条边的无向图,n个点每个点有一辆出租车,给出每辆出租车能开的最远距离和搭乘这辆车的费用,求起点到终点的最少费用是多少。解法:SPFA里套一个SPFA。第一个是利用乘坐某点的出租车A是否可以更新其他点的最少费用,但是从此点A出发还要求出此点到所有点的
ural 1143. Electric Path(凸包上最短哈密顿路径) 题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1143题意:逆时针给一个凸包的n(n解法:求最短哈密顿本身是一个NP问题,但是因为是凸包上,可以利用这个做;有一个性质:凸包上的最短哈密顿路径不会出现交叉。所以可以看出来从一点出发,他要么和顺时针相邻点连接,要么和逆时针相邻点相连接;通过这个性质可以通过dp做:ans[i][j
ural1147(Shaping Regions)矩形切割 题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1147题意:一个10000*10000的矩阵,初始颜色都为1,然后最多2500次涂色,每次涂色将一个矩形的面积涂成某个特定颜色,问涂完之后每种颜色最终的面积。解法:代码:/*********************************************
poj2288(Islands and Bridges) 状压DP 题目链接:http://poj.org/problem?id=2288题意:每个点有一个权值Vi,找一条哈密顿路径,路径的权值来自三条:1 路径上的Vi之和 2 所有相邻点对ij的Vi*Vj之和 3 相邻连续三点i,j,k(并且三点要构成三角形)Vi*Vj*Vk之和。解法:dp[st][i][j]表示从j走到i并且剩下集合st没有走的最大权值。关于路径书,在转移的时候顺便计算即可;
poj3311(Hie with the Pie)状压dp 题目链接:http://poj.org/problem?id=3311解法:标准的状压dp类型,先floyd获得两两之间最短距离。然后dp[i][j]表示剩下集合i没走,已经走到j的最短距离;代码:/******************************************************* @author:xiefubao******************
acdreamoj1108(The kth number) 题目链接:http://acdream.info/problem?pid=1108题意:n个数的数列,m次查询某个区间出现次数第k多的数出现的次数。n,m解法:这个因为是离线的所以可以先统一处理,然后再输出。可以维护一个left和right指针,pre,pre[i]表示此时区间内出现次数大于等于i的数的种类。为了减少复杂度,关键是left和right的移动方式,即查询区间如何排
poj2152(Fire) 树形DP 题目链接:http://poj.org/problem?id=2152题意:一棵带边权的树,边权表示节点间距离,在i上建立消防站的代价是w[i],如果在一点i没建消防站,那么它与距离这个点最近的消防站之间的距离不能大于d[i]。问满足建站最小的花费;解法;看了陈启峰的论文才会的,感觉挺难的,不过论文里分情况讨论了,应该不需要;dp[i][j]表示在i处选择j处作为供应站(但是并不一
CF(D. Fibonacci Sums)dp计数 题目链接:http://codeforces.com/contest/126/problem/D题意:一个数可以有多种由互不相同的斐波那契数组成的情况;解法:dp,容易证明:每个数通过贪心可以找到一种最少数量的斐波那契数组成方案;然后找到有多少种代替的方案;dp[i][0]表示前i个里面第i个数不动的方案数,dp[i][1]表示前i个里面第i个数下放的方案数,因为下放最多下放到已经
ACdreamoj 1011(树状数组维护字符串hash前缀和) 题目链接:http://acdream.info/problem?pid=1019题意:两种操作,第一种将字符串某个位置的字符换为另一个字符;第二种查询某个连续子序列是否是回文串;解法:有两种hash的办法,所以写了两种解法;首先hash是x1 * p^1+ x2*p^2 +x3*p^3...可以用树状数组维护前缀和,维护两个串,一个是正串,另一个是反串用于比较。比较时候乘以相应的p倍数判
ACdreamoj(1105)模拟题 题意:射一次激光最多可以攻击到几个敌人(由于激光很强大,可以在击中敌人后穿过它,而瑶瑶自己的坦克由于有特殊装置,所以不会被激光击中,激光也会直接穿过它). 表示此处为空地* 表示此处为障碍(激光不可穿过,激光路径打到障碍时就结束)T代表瑶瑶的坦克位置E代表敌人/ 代表按 左下-右上 放置的镜子\ 代表按 左上-右下 放置的镜子解法:模拟题。由于位置过
BZOJ2440(完全平方数)二分+莫比乌斯容斥 题意:完全平方数是指含有平方数因子的数。求第ki个非完全平方数。解法:比较明显的二分,getsum(int middle)求1-middle有多少个非完全平方数,然后二分。求1-middle的非完全平方数个数可以用总数减掉完全平方数个数。计算完全平方数的个数用容斥: 首先加上n/(2*2)+n/(3*3)+n/(5*5)+n/(7*7)...+...然后减掉出现两次的,然后加
Acdreamoj1116(Gao the string!)字符串hash+二分+矩阵快速幂 Problem Descriptiongive you a string, please output the result of the following function mod 1000000007n is the length of the stringf() is the function of fibonacci, f(0) = 0, f(1) = 1...a
hdu4390-Number Sequence(容斥计算) 题意:给定b数列,计算有多少种数列 a1,a2,...,an 满足条件 a1*a2*...*an=b1*b2*…*bn (ai>1).解法:处理出b数列中出现的所有质因子的数量记录在map中,然后进行容斥计算:代码:/******************************************************* author:xiefubao********
ACdreamoj1110(多重背包) 题意:裸的多重背包,水题。解法:和完全背包一样,只不过加一个数组,记录着每个物品用过的次数,多于存储量时就pass不更新。 还有一种方法是将每个物品用二进制压缩处理,第一个代码比较简单;代码:/******************************************************* author:xiefubao*******
Acdreamoj1115(数学思维题) 题意:1,3是完美数,如果a,b是完美数,则2+a*b+2*a+2*b,判断给出的n是否是完美数。解法:开始只看出来2+a*b+2*a+2*b=(a+2)*(b+2)-2,没推出更多结论,囧。没办法,只能暴力将所有的完美数求出来然后查表。正解是c+2=(a+2)*(b+2);完美数都是有质因子3或5组成的(5本身除外);自己暴力代码:/*******************
2014微软实习生面试经历 4月28号结束了最后的三面。等了一个多月,这个月初才收到了offer通知。因为三个面试官都没有要求我对面试内容保密,所以现在就将自己面试微软的整个过程记录为博文,供以后的面试者作为参考。转载请注明出处:http://blog.csdn.net/xiefubao。
ACdreamoj1114(Number theory)莫比乌斯容斥 题意:给n个数,为有多少互质对;解法:然后求出mou值,然后求出1,2,3...max的倍数的个数,每个出现在gcd中的对数(num[i]*(num[i]-1))/2,乘上mou值进行容斥计算。代码:/******************************************************* author:xiefubao******************
ACdream群赛1112(Alice and Bob) 题意:http://acdream.info/problem?pid=1112Problem DescriptionHere is Alice and Bob again !Alice and Bob are playing a game. There are several numbers.First, Alice choose a number n.Then he c
CF(441D Valera and Swaps)置换群 题意:1-n的一个排列 p1, p2, ..., pn,f(p)的定义是此排列要交换最少的数对可以回到原排列1,2,3,4...n。给一个排列p,要将其变换成f值为m的排列,问至少要交换几个数对,并输出字典序最小的那组答案。解法:处理出所有的置换群,求出环数k,此时f值为n-k。然后判断n-k和m的大小,分为两种操作 1、加环,这个是在任意元素个数大于1的环
zoj3647(组合数学) 题意:n*m的矩阵任选三个点,可以有多少种不同的三角形。解法:组合数学C((n+1)*(m+1),3)是所有三个点的情况。然后在减掉共线的。共线的分为两种: 1、共横线或竖线:C(n+1,3)*(m+1)+C(m+1,3)*(n+1); 2,斜线的:这个要枚举矩形,然后三个点有两个取矩形的对角线,另一点枚举(对角线上的整数点个数是gcd(i,j)
hdu4089(公式推导)概率dp 题意:有n人都是仙剑5的fans,现在要在官网上激活游戏,n个人排成一个队列(其中主角Tomato最初排名为m), 对于队列中的第一个人,在激活的时候有以下五种情况: 1.激活失败:留在队列中继续等待下一次激活(概率p1) 2.失去连接:激活失败,并且出队列然后排到队列的尾部(概率p2) 3.激活成功:出队列(概率p3) 4.服务器瘫:服务器停止服
hdu4336(状压dp求期望) 题意:每个零食包中装有第i号卡片的概率是pi,每个包最多一个卡片问获得所有卡片种类的期望零食包数;解法:状压dp,ans[i]表示剩余集合i时的期望。转移时枚举下一个取的种类。这个记忆化搜索超时,改成迭代才过,原因还不是很清楚。代码:/******************************************************* author:xiefub
poj3744(概率dp+快速幂) 题意:YYF从坐标1出发,每次走一步的概率是p,走两步的概率是1-p,然后有n个点上有地雷。问YYF走过雷区的概率是多少。解法:ans[i]表示走到i的概率。概率公式ans[i]=p*ans[i-1]+(1-p)ans[i-2]转移矩阵: ans[i] | p ,1-p | ans[i-1] =| |*ans[
hdu2089(数位dp) 题意:求区间内不含62和4的数的个数;解法:数位dp。int dfs(int pos,int pre,bool limit,bool have),pos表示dp到的数位位置,pre表示前一个数位的数字,limit表示到此时数是否有下降(此位取数字是否受限制的意思),have表示之前是否有62;4的排除是靠在每次枚举下一位i时不取4即可;每个case的dp值都是一样的,所以只需要计算一遍
hdu2049(组合数学) 题意:每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排;然后,让各位新郎寻找自己的新娘.每人只准找一个,并且不允许多人找一个.最后,揭开盖头,如果找错了对象就要当众跪搓衣板...假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能.解法:从N中选出M个C[n][m],然后乘上错排公式;f[n]=(n-1)*(f[n-1]+f[n-2]);f[0]=
hdu(2062)-Subset sequence 组合数学 题意:求集合{1,2,3...n}的第m个排列子集合。集合的大小按字典树排。 例两个元素的排列子集合按字典树排列是:{1},{1,2},{2},{2,1};解法:一个一个元素来确定,每次把剩余的元素按大小顺序排列在num中,然后根据排列组合原理直接计算下一个位置的元素的大小,直到排列数为0停止;代码:/*************************
CF(438D) The Child and Sequence(线段树) 题意:对数列有三种操作:Print operation l, r. Picks should write down the value of .Modulo operation l, r, x. Picks should perform assignment a[i] = a[i] mod x for each i (l ≤ i ≤ r).Set operation k
CF437D(The Child and Zoo)最小生成树 题目:D. The Child and Zootime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputOf course our child likes wal
CF(437C)The Child and Toy(贪心) 题意:给出一个无向图,每个点有点权,操作是一个一个将所有点揪走直至剩下一个点,揪走一个点的代价是剩下点中与其连边的点的点权和。求完成操作所需花费的最小代价。解法:贪心的思想,每次将剩余点中点权最大的点揪出,这样可以保证每条边都是会选择相对小的点权被消耗掉。所以直接输出所有边的边权和即可。代码:/****************************************
zoj3791(An Easy Game) DP 题意:给出两个01字符串s1,s2.每次改变s1上m个位置的字符。问k步之后使得s1变为s2的方法有多少种。解法:DP,关键是状态的设计。考虑还是唯一性和可传递性。dp[i][j]表示第i步后有j个不同到目标的走法数。记忆化搜索dp[0][dif](dif表示初始时不同字符的个数)。转移时候枚举选择情况即可。代码:/*****************************
hdu2604(矩阵快速幂) 题意:字符串只能由f和m两种字符构成,问长度为L且不出现子串fmf,fff的字符串有多少种.解法:初始的矩阵应该是 mm 1 0 0 1 mm 。但是应为不能出现fmf,fff子串,所以fm和ff后面不能跟f ff 0 1 1 0 ff
2014北京邀请赛E题-矩阵快速幂 题意:长度为n(1解法:矩阵快速幂。dp[i][j]表示i长度最后连续j个不同(即最后j个无重复,最后j+1个有重复)的字符串的个数。状态选好很重要。设计状态时最重要考虑是唯一性和可传递性,比赛时明明知道肯定是矩阵快速幂,但是一直没想到这个状态表示,自己设计的自己都不会转移。 dp[i][j]有了后,后边加一个字符,这个字符可以是j之内的任意一个,也可以是j以外的,
hdu4118(树形DP) 题意:给一棵树(每个节点是一个城市),每个节点上有一个人。每个人都要到另外一个城市,并且每个城市最后只能有一个人。问全局所有人旅行的最长的长度可以是多少。解法:一定可以构造一种这样的情形:对于每条边,使得少的一边的所有人都到另一边去。这样就实现了每条边的最大化利用。一定是最优解。代码:/**********************************************
poj3071(概率DP) 题意:淘汰赛制,2^n(n解法:ans[i][j]表示第i个队员第j轮胜出的概率。赢到最后需要进行n场比赛。算出每个人赢到最后的ans[i][n]。写出序号的二进制发现一个规律,两个队员i、j如果碰到,那么一定是在第get(i,j)场比赛碰到的。get(i,j)计算的是i和j二进制不同的最高位,这个规律也比较明显。代码:/******************************
poj3295(模拟) TautologyTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 9078 Accepted: 3477DescriptionWFF 'N PROOF is a logic game played with dice. Each die has six
poj1039(计算几何)线段相交 题意:给一个管道求光线能穿到的最大x坐标。解法:通过旋转光线一定可以使得光线接触一个上点和一个下点。枚举接触的上下点,然后逐一判断光线是否穿过每个拐点面。碰到一个拐点面没有穿过的,则是因为与其左边线段相交,求出直线与线段交点更新答案即可。不想交则说明在前一个拐点已经穿出去了。代码:/**********************************************
poj2115(扩展欧几里得运用) 题意:求for(int i=a;i!=b;i+=c,i%=(1解法:即求解C*x-(1C*x+K*y=b-a;如果g=gcd(C,K)不能被b-a整除,则说明无解。 用exgcd()求出一组C/g*x+K/g*y=1的解,然后两边乘上(b-a)/g将求出的x取最小正数输出。代码:/*************************************
hdu4386(求四边形最大面积) 题意:给出一个四边形的边长,求四边形最大面积。不合法输出-1;解法:比较明显的三分,先枚举四边形的边的连接,然后三分一个对角线长度。但是比较怪异的是eps取1e-8wa了,去1e-7才可以过。不知道谁可以解释一下。 还有这题还有一个结论,后来才知道的。len是周长的二分之一。area=sqrt((len-a)*(len-b)*(len-c)*(len-d));
hdu3709(求区间内平衡数的个数)数位dp 题意:题中平衡数的定义: 以一个位置作为平衡轴,然后左右其他数字本身大小作为重量,到平衡轴的距离作为全职,实现左右平衡(即杠杆原理平衡)。然后为区间[x,y]内平衡数的个数。 (0 ≤ x ≤ y ≤ 1018)解法:数位dp。如果一个数的平衡数,那么它的平衡轴位置是确定的。原来一直尝试数位dp在dfs时候列举平衡轴的位置,后来才意识到可以提前枚举平衡轴位置,然后再dfs,这样比较好写
hdu3652(数位dp) 题意:求1-n(n解法:数位dp。LL dp[pre][now][have][iflow][rem]记录着第pre位为now,have表示前边是否出现过13,iflow表示dp过程否有降低,rem表示后续需要的余数是多少。代码:/******************************************************* author:xiefubao
UVALive 6609(Minimal Subarray Length)维护递增序列|RMQ 题意:给一个整数序列(可能有负数),求最短的连续序列使得序列之和大于等于整数x;解法:第一种是On的复杂度: 我们要的是sum[j]-sum[i]>=x,如果有两个决策j = sum[j'],那么j就是没用的。即维护一个sum[j]递增序列。然后每次可以二分查找,但是这里有个特点就是要得到最近的,可以同时维护一个left指针,left指针用于跟进更
poj3737(三分搜索) 题意:给出一个圆锥的表面积(侧面积+底面积),求圆锥的最大体积。解法:三分半径。左边界随便取个极小的数,右边界可以假定这个圆锥是平的,高是0.这是底面积的二倍是表面积。代码:/******************************************************* author:xiefubao***************************
poj2282(数位dp) 题意:计算a-b中各个数字出现的个数;解法:数位dp(思想都是先算1-b的个数,然后减掉1-a中的个数),1-9数字的计算和前边计算1的那一篇数位dp差不多,计算0时候要加一维表示前缀是否全是0;代码:/******************************************************* author:xiefubao*****************
Codeforces(429D - Tricky Function)最近点对问题 D. Tricky Functiontime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputIahub and Sorin are the best competitive
数位dp(求1-n中数字1出现的个数) 题意:求1-n的n个数字中1出现的个数。解法:数位dp,dp[pre][now][equa] 记录着第pre位为now,equa表示前边是否有降数字(即后边可不可以随意取,true为没降,true为已降);常规的记忆化搜索代码:/******************************************************* author:xiefubao
poj4048(计算几何) 题意:有一个强大的弓弩,可以射穿所有障碍,给n(n解法:离散化所有的墙段点,以出发点为一端和每个墙端为另一端(加长到足够长),然后分别计算和多少线段非严相交。线段非严格相交的判定是: 1、严格相交(叉积判断) 2、点在线段上,这时叉积等于0并且点在线段之间代码:/**************************************************
hdu3336(Count the string)KMP的应用 题意:给一个字符串,计算所有前缀在字符串中出现的次数和。解法:KMP计算出Next数组后,每个位置的Next数组不断往前递归,每次相应前缀次数就加1.代码:/******************************************************* author:xiefubao************************************
lightoj1060(求字符串第k大排列)组合数学 题意:求给定字符串(有重复字符)第k大排列。解法:先判断字符串的所有排列是否够k个。然后从左向右每一位每一位确定。简单的组合数学。代码:/***************************************************** author:xiefubao************************************************
lightoj1061 (N Queen Again)搜索+状压dp 题意:(八皇后问题的变形)给定8个皇后的位置,然后问最少要走几步使得每个皇后之间可以不相互攻击(不在同一行同一列同一斜线)。其中走的过程每步可以横着竖着斜着走多个格子。解法:先枚举所有合法的八皇后局面(总共92种)。然后将给的点对合法八皇后局面进行匹配。dp[i][j]表示合法八皇后前i个点用掉给定八皇后集合的子集j所花费的最小步数。这里的匹配相当于两个集合各八个点,进行一一配对。原来
poj3080(Blue Jeans)kmp求多个串公共子串 题意:给出1-10个长度为60的字符串,求出最长的公共子串(长度不能小于3),如果有多个一样长的,输出字典序最短的。解法:想到kmp时,自己第一反应枚举第一个串的所有子串,在其他所有串中走一遍kmp,复杂度为10*60*60*60,但是发现只需枚举第一个串后缀就可以,每次枚举记录在所有串能走最远中走的最短的那个长度。这样复杂度就成了10*60*60,0ms AC。代码:/*****
poj1011(深搜+剪枝) 题意:给m根木棍,将它们重新拼成n根一样长的木棍,并使得n尽量大(即每个新木棍尽量短)。解法:经典的搜索题目。从小到大枚举拼成的新木棍长度,每次枚举进行一次深搜。这题关键是如何剪枝。 1、当枚举的长度不能整除总长度的时候,剪枝;(这个很显然) 2、先将木棍从长到短排序,枚举时先尝试长的木棍。(先枚举长的可以使得搜索深度不至于过深)
poj3265(Problem Solving) dp 题意:奶牛群有P种问题,每个问题可以在一个月的时间内修复。修复每个问题要付出相应的代价。对于修复第i个问题,修复月开始时候要付出预付Bi,修复完的下个月初要付出Ai。必须按照1-p的顺序修复(可以多个在同一个月修复)。每个月,奶牛们可以产生M的价值,每个月产生的价值只能再下个月使用,不能累计。问最快可以几天完成所有修复。解法:ans[i][j]表示最后一个月(其实是倒数第二个月)修复了