自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 资源 (1)
  • 收藏
  • 关注

原创 软件能力认证题---拼图(状态压缩DP+矩阵快速幂)

题意: 给定n*m的棋盘(1思路:m的范围只有1状态表示:0代表此处留空,1代表此处被填满。01序列压缩成一个int型来表示一行的填放情况。(例如:状态为4,则代表100,即第一列填满,第二第列三空)递推矩阵是长这样的:边界条件:其中,t = 2^M代表将前i-1行填满,且第i行放置了状态s时的总方案数。代表上一行原本放置了状态s2的前提下,当前行放置骨

2014-12-07 11:55:13 1928

原创 HDU 1269 迷宫城堡 (有向图强连通分量Tarjan)

题意:给定有向图,判断是否为强连通图。思路:方法很简单,直接Tarjan求图强连通分量个数是否为一即可。主要是把Tarjan模板附上来以后好整理。。。Byvoid的Tarjan算法讲解很详细:https://www.byvoid.com/blog/scc-tarjan/#include#include#include#include#define NODENUM 10005#

2014-02-26 09:20:03 1472

原创 HDU 3001 Travelling (状态压缩DP)

题意:有n个点(n可能有重边),问从任一点走遍整个图的最短费用和,其中每个点最多只能经过两次。思路:tsp问题,状压dp。三进制压缩一个点已被访问的次数作为状态s,dp[s][i]代表状态s下最后一个到达的点位i的最小费用。递推方程:在dp[s][i]已计算出来的情况下,枚举下一个到达的点k,那么dp[news][k] = min{ dp[news][k]+Edge[i][k],dp[news

2014-02-08 20:16:00 1054

原创 POJ 3254 Corn Fields (状态压缩DP)

题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻。问有多少种放牛方案(一头牛都不放也是一种方案)思路:dp[i][s] 代表第i行状态为s(s是每个位置放与不放组成的0-1序列对应的十进制数)时所能得到的方案总数递推方程:dp[i][s] = Σdp[i-1][f]

2013-12-04 20:14:07 718

原创 HDU 4099 Revenge of Fibonacci(高精度+字典树)

题意:对给定前缀(长度不超过40),找到一个最小的n,使得Fibonacci(n)前缀与给定前缀相同,如果在[0,99999]内找不到解,输出-1。思路:用高精度加法计算斐波那契数列,因为给定前缀长度不超过40,所以高精度计算时每次只需保留最高60位,每次将得到的值插入到字典树中,使得树上每个节点只保留最小的n值。查询输出字典树结点的值。#include#include#inclu

2013-10-30 09:46:17 834

原创 UVA 10859 Placing Lampposts (动态规划)

题意:一个n个点m条边的无向无环图,在尽量少的节点上放灯,使得所有边都被照亮,每盏灯将照亮以它为一个端点的所有边,在总灯数最小的前提下,被两盏灯同时照亮的边数应尽量大。思路:无向无环图就是“森林”,常用树形dp,本题要优化的目标有两个,放置的灯数a应尽量少,被两盏灯同时照亮的边数b应尽量大,为了统一,我们把b替换成”恰好被一盏灯照亮的边数c尽量小“。然后设x=Ma+c为最终的优化目标,M是一个

2013-08-21 15:34:34 847

原创 UVA 10635 Prince and Princess (动态规划)

题意:有两个长度分别为p+1和q+1的序列,每个序列中的元素互不相同,且都是1到n^2之间的整数(2思路:原本是LCS问题,但是普通的LCS算法复杂度是O(pq)显然TLE。注意到元素均不相同,可以把A中的元素重新编号为1到p+1。例如样例中的A={1,7,5,4,8,3,9},B={1,4,3,5,6,2,8,9},那么把A重新编号为{1,2,3,4,5,6,7},则B={1,4,6,3,0

2013-08-19 17:55:39 751

原创 POJ 3517 And Then There Was One (递推,约瑟夫问题变形)

题意:1到n这n个数排成一圈,第一次删除m,以后每k个数删除一次,求最后一个被删除的数。思路:看了刘汝佳的书,怎么都看不懂,最后自己按照书上的大体思路,自己推了一个和书上不同的公式过了。。设有n个数字分别是0到n-1,第一次删除0,以后每k个数删除一次,最后被删除的数字是f(n)。那么,f(1)=0,f(n)=(f(n-1)+k-1)%(n-1)+1。因为我们可以把删数字的过程看成这样

2013-08-19 16:58:35 1068

原创 POJ 1903 & ZOJ 2469 & UVA 1326 Jurassic Remains (部分枚举)

题意:给定n个只有大写字母组成的字符串,选取尽可能多的字符串,使得这些字符串中每个字母的个数都是偶数。n思路:直接枚举每个字符串的选或不选,复杂度是O(2^n)。其实还有更简便的方法。对于每个字母,其实具体出现了多少次并不重要,重要的是奇数次还是偶数次,我们用0对应奇数次,1对应偶数次。对于每个字符串,我们就可以计算出对应的二进制数,方法如下。如果A出现奇数次,那么二进制数第一个位置为1,

2013-08-16 15:18:32 1586

原创 UVA 10891 Game of Sum (动态规划)

题意:有一个长度为n的整数序列,A和B轮流取数,A先取,每次可以从左端或者右端取一个或多个数,所有数都被取完时游戏结束,然后统计每个人取走的所有数字之和作为得分,两人的策略都是使自己的得分尽可能高,并且都足够聪明,求A的得分减去B的得分的结果。思路:很容易想到一个复杂度是O(n^3)的方法,设dp(i,j)为第i个到第j个数时,先手能获得的最大分数,注意到对于一段整数序列,先手的得分与后手的得

2013-08-16 11:34:16 1479

原创 HDU 4681 String (动态规划)

题意:给定字符串A,B,C,寻找一个最长的D,满足以下条件:1)D是A的子序列2)D是B的子序列3) C是D的子串 (子串是指连续的子字符串)求出D的长度思路:先对A,B正向求最长公共子序列记录在f(i,j)中,再对A、B逆向求最长公共子序列记录在g(i,j)中。在A和B中寻找子序列C,对于C在A、B中的每个起点,只需要找出C在其中结束最近的位置就可以了。例如A是abbb中

2013-08-15 16:44:18 1214

原创 HDU 1505 & POJ 1964 City Game (递推+扫描法)

题意:一个矩阵,有些格子是F,有些是T,要你找到最大的子矩阵使得矩阵内全是F思路:直接枚举每个子矩阵,显然复杂度是O(m^3 n^3),显然TLE。 我们可以使用扫描法:用up(i,j),left(i,j),right(i,j),分别表示格子(i,j)悬垂线(悬垂线就是指这个格子往上走遇到第一个不是F的格子之前的线段)的长度,

2013-08-15 03:48:20 1695

原创 ZOJ 3123 Subsequence (动态规划)

题意:有n个正整数组成一个序列。给定整数S,求长度最短的连续序列,使他们的和大于或等于S思路:题目数据范围10sum(i)为前i个数字之和,f(i)代表以第i个数字为结尾的连续子序列长度,要求这个子序列之和大于或等于S而且长度最小。(1)如果sum(i)(2)如果sum(i)>=S,那么只需要找到一个最大的j,使得sum(i)-sum(j)>=S即可,那么f(i)=i-j。注意

2013-08-14 12:45:54 1627

原创 HDU 2333 & POJ 3497 & UVA 12124 Assemble (二分答案)

题意:有b块钱,要装一台电脑,给出n个配件各自的种类、品质因子和贾哥,要求每种类型的配件各买一个,总价不超过b,且“品质最差配件”的品质因子应尽量大,输出最小品质因子的最大值。思路:解决“最小值最大”的常用方法就是二分答案。假设答案为x,那么删除品质小于x的所有配件,如果能组装出一台电脑,那么正确答案ans>=x,否则ans如何判定能组装出一台电脑呢?只要在删除品质小于x的所有配件后,取每

2013-08-14 11:02:36 1804

原创 HDU 4671 Backup Plan (水题)

题意:(已经过本人转化。。。)有M个数据站,N个服务器,每个数据站有一个序列,这个序列就是该数据站存放自己的数据备份时的优先级顺序,如果排在第一的服务器坏了,就往排第二的服务器里存放自己的备份,以此类推直到可以存放自己的备份为止。这么一来,每个服务器就会存放一定数量的数据站的数据备份。例如,所有服务器都没坏,而A数据站和B数据站拥有的服务器优先级序列中第一个都是服务器2,那么第二个服务器就存放

2013-08-13 16:41:52 1205

原创 UVA 11549 Calculator Conundrum (Floyd判圈算法)

题意:有个老式计算器,每次只能记住一个数字的前n位。现在输入一个整数k,然后反复平方,一直做下去,能得到的最大数是多少。例如,n=1,k=6,那么一次显示:6,3,9,1...思路:这个题一定会出现循环,所以一个个模拟,遇到相同的就再之前所有数中找最大的输出即可。怎么判断遇到相同的呢?如果装在数组里一一比较显然很慢,如果用v[k]判断k是否出现过,k范围太大空间不够用。第一种方法是使用

2013-08-12 16:23:16 949

原创 UVA 11464 Even Parity (独特思路)

题意:有一个n*n的01矩阵,任务是把尽可能少的0变成1,使得每个元素的上、下、左、右元素之和为偶数。思路:很容易想到的思路是枚举每个点是0还是1,因为n#include#include#define INF 0x3f3f3f3f#define MAXN 20using namespace std;int n,ori[MAXN][MAXN],t[MAXN][MAXN],

2013-08-12 14:06:54 734

原创 FZU 2129 子序列个数 (动态规划)

题意:子序列的定义:对于一个序列a=a[1],a[2],......a[n]。则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列,其中1<=p1<p2<.....<pm<=n。例如4,14,2,3和14,1,2,3都为4,13,14,1,2,3的子序列。对于给出序列a,请输出不同的子序列的个数。(由于答案比较大,请将答案mod 1000000007)思路:

2013-08-11 20:20:25 1536

原创 FZU 2125 简单的等式 (数学+枚举)

题意:现在有一个等式如下:x^2+s(x,m)x-n=0。其中s(x,m)表示把x写成m进制时,每个位数相加的和。现在,在给定n,m的情况下,求出满足等式的最小的正整数x。如果不存在,请输出-1。思路:从小到大枚举s(x,m)的值,解出x的值,看看是否满足x^2+s(x,m)x-n=0,如果满足则输出x。因为1#include#include#includetypedef long

2013-08-11 19:58:00 1079

原创 FZU 2124 吃豆人 (BFS)

题意:在一个N*M的矩阵里面,有一个吃豆人,每次可以上下左右移动,每次移动消耗1s,有些格子有障碍,矩阵中有且仅有一个豆子,吃豆人沿直线可以吐舌头吃豆,舌头伸长一格消耗0.1s,吃完还要收缩回来,收缩一个也消耗0.1s。地图中至多有一个加速器,吃了加速器以后速度变成原来的两倍,吐舌头速度不变。问到豆子至少要多久,如果吃不到输出-1。思路:1.先考虑没有加速器的情况,因为只有一个豆子,因此可以以

2013-08-11 19:43:02 1689

原创 FZU 2123 数字的孔数 (入门题)

题意:S得到一个数,他想知道这个数每一位上的数字的孔数之和。1,2,3,5,7这几个数字是没有孔的,0,4,6,9都有一个孔,8有两个孔。思路:水题,用数组记录每个数字的孔数,加起来就是答案。#include#include#includeusing namespace std;int cnt[15]={1,0,0,0,1,0,1,0,2,1},T;char str[1000

2013-08-11 19:20:43 875

原创 FZU 2122 又见LKity (KMP)

题意:将给定字符串中的特定子字符串替换成另外一个字符串。思路:水题,KMP算法寻找字符串并替换#include#include#define MAXN 50005bool v[MAXN];void getFail(char *P,int *f){ int m=strlen(P); f[0]=f[1]=0; for(int i=1;i<m;++i) { int j=f[

2013-08-11 19:17:21 790

原创 HDU 4576 Robot (暴力)

题意:在一个圈上,起点是1,有m次移动,每次顺时针移动wi格或者逆时针移动wi格,顺时针和逆时针的概率都是1/2。问最后停留在l到r之间的概率思路:显然的递推式子:p[i][j]=0.5*p[i-1]([j+w)%n]+0.5*p[i-1][(j-w+n)%n];。本人用了输入优化。虽然很暴力,但还是勉强ac了。(网上某些题解用G++能过,C++不能过),然后据说还有矩阵乘法的方法可以更快

2013-08-10 22:31:26 983

原创 UVA 11078 Open Credit System (水题)

题意:给一个长度为n的序列A0,A1...An-1,找出两个整数Ai和Aj(i思路:O(n^2)算法显然TLE,因此对于每个数Ai,其实只要减去Ai+1到An-1中的最小值即可,倒着扫并用一个minval去维护Ai+1到An-1中的最小值,用Ai减去当前的minval就是Ai作为第一个数来减去第二个数所能得到的最优解。输出所有的最大值即可。完全是一道水题。。拿来测试刚学会的输入输出优化。。

2013-08-09 16:36:50 802

原创 UVA 11462 Age sort (基数排序+优化输入输出)

题意:给若干个1~100的数字,要求排序后输出。思路:读入文件约有25MB,因此无法使用快速排序,注意到数字范围特别小,可以使用基数排序。但是这不是重点,关键是优化输入输出,方法非常猥琐,对于这种大规模的输入输出,效果特别明显。。。#include#include#includeint sort[101],buf[10],n,t;inline int readint(){ ch

2013-08-09 16:04:50 778

原创 UVALive 3635 Pie (二分答案)

题意:有F+1个人来分N个圆形派,要求每个人得到的派必须是一整块的,不能是几块拼在一起的,而且每个人得到的派的大小一样,问每个人最多能得到的派的面积。思路:一开始拿到题目,我尝试推公式,后来觉得实在找不到规律,看了书,发现是二分答案,把问题转化为“是否可以让每个人的到面积为x的派”。因为派是不可以拼起来的,所以每个派可以分到[PI*r^2 / x]个派,把每个派可以分出的块加起来看是否>=F+

2013-08-09 15:00:45 1143

原创 UVA 11384 Help is needed for Dexter (找规律)

题意:给一个正整数序列1,2,3....,n。每次操作可以从序列中选取任意多个数字同时减去一个相同的正整数,问至少多少次操作可以把所有数字变成0.思路:首先,例如,1,2,3,0,1,2我们可以等价成1,2,3,。经过自己操作可以发现,第一次时把[n/2+1n,]减去n/2+1最好,这时会得到序列1,2,3.....n/2,0,1,2,...(n-1)/2.,它等价于1,2,3...n/2.

2013-08-09 13:38:56 616

原创 HDU 4662 MU Puzzle (水题)

题意:给定字符串,下面定义几个操作:1)将Mx变成Mxx,例如MII可以变为MIIII2)将III替换成U3)去掉连续两个U,例如MIUU可以变成MI现在问你能不能将MI转换成给定字符串。思路:注意到以下几个性质。第一,MI怎么变换M永远只能在第一位。第二,因为变换时只能在I和U之间变换,因此,除了第一个是M以外,后面如果有字符串不是U、I以内的话永远不可能变换得到。第三,

2013-08-09 12:57:59 1105

转载 国家集训队论文分类整理

转自:http://www.cnblogs.com/AbandonZHANG/archive/2012/07/21/2601889.html国家集训队论文分类整理距离ACM/ICPC的时间越来越少了,选择性地看一些集训队论文是很有必要的。(在此给已经看过所有论文的神牛跪了= =)所以,我在此整理了一下,供大家参考。组合数学计数与统计200

2013-08-09 11:16:05 757

原创 POJ 3225 Help with Intervals(线段树)

题意:区间交、并、减、补思路:用线段树的叶子节点记录该点是否被区间覆盖,因为有开区间的情况,因此考虑离散,将数值乘以2。U:把区间[l,r]覆盖成1I:把[-∞,l)(r,∞]覆盖成0D:把区间[l,r]覆盖成0C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换S:[l,r]区间0/1互换区间修改容易做,但是加上区间异或就难了。我们考虑维护这样一棵

2013-08-09 10:48:32 994

原创 POJ 2528 & UVA 10587(线段树+离散+区间修改)

题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报。思路:线段树直接做会TLE+MLE,因此需要离散。所谓离散就是将区段进行压缩,但是又不改变区间的位置关系。方法就是将区段的端点值去掉相同的进行排序,举个例子:给定4个区间[2,4] [3,6] [8,10] [6,9],覆盖关系就是后者覆盖前者,每个区间染色依次为 1 2 3 4。现在我们抽取这4个区间的8个端点,2 4

2013-08-05 16:53:47 1189

原创 POJ 3468 A Simple Problem with Integers(线段树)

题意:给一串整数,每次使区段增减一个数,或者查询区段内数字和思路:线段树模板题,用add标记。具体内容可参考代码或者刘汝佳训练指南。#include#include#define MAXN 100005typedef long long LL;LL n,Q,ql,qr,v,sumv[MAXN*3],a[MAXN],addv[MAXN*3],_sum;char op;void b

2013-08-05 12:46:52 638

原创 HDU 1698 Just a Hook(线段树)

题意:初始时整个区段值为1,然后每次使区段[L,R]内的值全部改为某个值,最后输出整个区段和思路:线段树区间维护,成段替换。模板题,具体方法见代码,或者参看刘汝佳训练指南。#include#include#include#define M ((R+L)>>1)#define ls (o<<1)#define rs (o<<1|1)#define lson ls,L,M#def

2013-08-04 22:30:08 600

原创 HDU 1554 Palindromes(回文串+动态规划)

题意:给定若干字符串,输出每个字符串的回文子串个数,这里回文串在原字符串中必须是连续的。思路:用f(i,j)代表str[i....j]是不是回文串,容易得出递推式f(i,j)=f(i+1,j-1) && str[i]==str[j],然后将所有的f(i,j)加起来就是答案了。(注意f(i,i)=1和i+1>j-1的情况)但是这个题目开5000*5000的数组会MLE。于是注意到每次f(i,

2013-08-04 15:30:59 845

原创 UVA 1401 & LA 3942 (字典树Trie+递推)

题意:给出一个由S个不同的字符串组成的字典和一个长字符串,问:把这个长字符串分解成若干个字典中出现的字符串,共有几种分法。单词可以重复使用。思路:将所有字典中的单词插入字典树中,用d[i]表示str[i]到str[n]的所有分解法数。所以有d[i]=sum(i+len(x)),其中x为str[i]为开头的字符串str[i...n],即枚举x,x={str[i]}或{str[i],str[i+1

2013-08-03 23:01:09 699

原创 POJ 2886 Who Gets the Most Candies?(线段树)

题意:N 个小孩围成一圈,他们被顺时针编号为 1 到 N。每个小孩手中有一个卡片,上面有一个非 0 的数字,游戏从第 K 个小孩开始,他告诉其他小孩他卡片上的数字并离开这个圈,他卡片上的数字 A 表明了下一个离开的小孩,如果 A 是大于 0 的,则下个离开的是左手边第 A 个,如果是小于 0 的,则是右手边的第 -A 个小孩。游戏将直到所有小孩都离开,在游戏中,第 p 个离开的小孩将得到 F(

2013-08-03 17:44:57 861

转载 短小精悍的线性时间素数筛法

输入n,求n以内的所有素数算法用两个数组存储数据:一个是prime[],存储n以内所有的素数,其index为pi,初值为0一个是is_prime[i],表示自然数i(i算法如下:linear_prime_sieves1:  set is_prime[] to true2:  for i=2 to n3:    if is_prime[i]=true then pri

2013-08-03 10:32:23 752

原创 POJ 2828 Buy Tickets(线段树)

题意:有n个人(每个人价值为val[i])依次从外面往队伍中插队,每次都会插在第pos[i]个位置,原本在pos[i]及其后面的人将会往后移一位,按最后队伍的顺序输出这些人价值。思路:正着模拟显然超时,可以这样想,每次入队的人位置由两个因素影响,一来是他本身插队到的位置,第二个是后面的人插队使他往后移位。注意到最后差进来那个人位置一定不会改变,考虑到倒序插入队伍。现在我们观察插入到位置x的这个

2013-08-02 21:37:52 723

原创 HDU 4639 Hehe(字符串动态规划)

题意:给定一串T串字符串,每个hehe可能有两种意思,要么是就是hehe,要么是wqnmlgb,现在要问这串字符串的意思的可能数模10007思路:对于连续的he,可以推导,f[i]代表连续i个he表达意思的可能数,f[i]=f[i-1]+f[i-2]。然后,将不同的连续he串之间的可能数相乘即可。(组合原理)(其实不是通过直接观察得出满足斐波那契数列的,可以推导的)连续i个he表达可能

2013-08-02 15:56:35 712

原创 HDU 4632 Palindrome subsequence(区间合并动态规划)

题意:给定T串只含小写字母的字符串,对于每串,输出回文字串的数目模10007思路:区间合并,对于从第i个字符到第j个字符的串里面          (1)如果str[i]!=str[j],则dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1],即回文串在[i,j-1]的情况数加上[i+1,j]的情况数,再减去两种重叠部分的情况数,即属于[i+1,j-1]的

2013-08-02 15:25:50 534

[MATLAB智能算法30个案例分析].史峰等.扫描版

一个关于人工智能算法的案例分析,由浅入深,简单明了。帮助深刻理解并掌握各种人工智能算法

2015-07-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除