随笔分类 - ACM
摘要:动态规划去年选拔赛的一个题目,题意就是给一个序列,要找出一个子序列,一增一减(第偶数个元素要比它前面的元素小,第奇数个元素要比它前面的元素大)算是比较基础的DP,属于"第i个元素与它前面i-1的元素形成的一种关系,最后变为前i个元素的信息"dp[i]表示加入第i个数字,与前i-1个数字能形成的最大长度,因此面对两个两个问题,第i个元素会不会加入到最终的最长子序列中,要加的话怎么加先看方程 dp[i]=max{ dp[j] } + 1; 若dp[j]为奇数,若想加入第i个元素,那么第i个元素将会是子序列中的第偶数个元素,那么还要满足a[i]<a[j]若dp[j]为偶数,
阅读全文
摘要:最短路径选拔赛的题目,当时一看就觉得做过类似的,马上写了个DP,怎么都WA,一直WA到结束。后来才想起来是个图论,求最短路题意:给一个矩阵,T表示树,.表示沙,#表示路,都是可以走的,而且他们各自带有一个值,vt,vs,vp,走到这个点要算上他们带的值,@表示石头不能走。再给你起点的行列和终点的行列(行列都是从0开始标记的),每次你都可以往上下左右四个方向走,重复走回同一个点也行,问你从起点走到终点的花费最少,(其中,起点带的那个值不用算上)首先读入原始的矩阵,把他们的值都记好,石头不能走,可以把它的值赋值为无穷,也可标记为-1,等下不需要用到它(代码中是标记为-1)然后按行从左到右给所有点标
阅读全文
摘要:状态压缩DP题意:输入n,m,一个n*n的棋盘,放入m个国王,国王不能相互攻击,有多少种放置的可能。国际象棋的国王的攻击范围就是它周围的一圈,一共8个格子(上下左右四个对角)和 poj 1185 炮兵布阵 非常相似 , 同样使用位运算加速,同样可以使用滚动数组代码有详细注释/*state[i]表示第i种状态,即一行内的国王不互相攻击的状态,king[i]对应这种状态有多少个国王关于相邻两行的状态是否能共存的问题,也就是两行的国王会不会相互攻击,state[k]表示第i行的状态,state[kk]表示第i-1行的状态state[k] & state[kk] = 1 , 说明在某一列上有国
阅读全文
摘要:动态规划1.先考虑在1到n的村长里面放一个邮局的最优解,那么就是把邮局放在最中间的那个村庄处最优(若村庄数为偶数则最中间的村庄有两个哪个都可以)2.当放m个邮局的时候,其他每个邮局相当于有一个控制范围,范围内的村庄离该邮局最近,那么m个邮局会把n个村庄分为m块,我们就是dp每一块,令每一块的值最优,以及加上还没有处理的大块的最优解,则是我们要的答案dp[i][j]表示从1号到i号村庄放j个邮局的最优解方程:dp[i][j]=min{ dp[k-1][j-1]+s[k][i] } s[k][i]表示在k号村庄到i号村庄放1个邮局的最优解,也就是放在最中间记忆化搜索/*dp[i][j]=min{.
阅读全文
摘要:贪心 or 动态规划题目是归在动态规划里面的,但是看完之后觉得是贪心,而且貌似是水题,不知道为什么会把难度定为400多,觉得定为100多可以了题意:输入a,b,表示有b-a+1个数,然后给出这n个数,将他们划分成几块,每块都是单调递增的或者单调递减,问块数最少是多少贪心:首先处理一下原序列中相邻的数字不能相同,一开始没有做这个处理是WA的,处理后AC。所以题目的意思应该是指严格单调,相同的部分是不算在里面的(个人理解,否则没法解释这个WA)。好像1 2 3 3 3 3 4 是变为1 2 3 4
阅读全文
摘要:动态规划题意:让你猜一个物品的价格,猜低了或者猜高了都会提示你。G,L,表示你有G次机会猜一个数,如果猜错了,G会减少1次,如果你的错误是应该是猜高了,那么L也会少一次(猜低了L不会少)。如果G次机会都用完了,则输;若G次机会还有剩余,而L次机会用完了,这时再猜一个数,若猜高了,那么也输了。让你确定一个数字N,以保证在G,L的条件下,你一定能猜到[1,N]以内的任何一个数1.如果L等于0,也就是说你在猜的过程中,绝对不能猜高,所以你只能从1开始猜,并依次为2,3,4……最大能猜到的数是G,所以N=G,这样才能保证你一定能猜到其中的任何一个数2.L>G,这是个迷惑的情况,其实L比G大是没意
阅读全文
摘要:动态规划一开始定义为dp[l1][l2][l3][dd],表示用l1个{},l2个[],l3个(),深度为dd的方案数,后来不行。参考别人后,dp[l1][l2][l3][dd]表示深度小于等于dd的方案数,那么答案是dp[l1][l2][l3][dd]-dp[l1][l2][l3][dd-1]可以用分块和整块的思想来看这个问题好像[[()][]] 这类的我们可以说它是整块,[][](),这类的我们可以说它是分块,我们在构建的dp数组的时候就是把其当做是分块来处理,然后使用乘法原理例如dp[l1][l2][l3][dd],我们可以先构建一个小分块,用小分块的方案数*其实括号能组成的方案数,而这
阅读全文
摘要:动态规划poj 1141 ural 1183 zoj 1463 都是相同的题目,黑书DP的例题输入比较恶心,有空串。递推的时间是1s多,记忆化的时间是4.3s勉强过,原理不说了百度各种有/*1.dp[i][j]=dp[i+1][j-1] , p[i][j]=-1 , --->p[i+1][j-1]2.dp[i][j]=dp[i+1][j]+1 , p[i][j]=-2 , --->p[i+1][j]3.dp[i][j]=dp[i][j-1]+1 , p[i][j]=-3 , --->p[i][j-1]4.dp[i][j]=dp[i][k]+dp[k+1][j] , p[i][
阅读全文
摘要:动态规划也是经典题目,黑书上也有介绍。今晚上JAVA在想,想了一下想出来,需要五维,大矩形的值由小矩形得到,这个状态转移方程个人感觉还是比较想到,但是一些细节的地方还没想到怎么处理,回来瞄一眼黑书得到了标准差的一个转化公式,所以疑团解开,便开始打代码(看黑书过程中它写的状态转移方程和我想的一样,但是有一些细微的细节,我感觉我这样处理比较保险,我后来细想了一下它的,虽然没有判断但是可能也不会出错,但是更倾向于我自己想的那种,就是关于横着切和竖着切的范围)忘记搞掉注释WA了一次,搞掉后就AC了,算是 一次成型不用debug,后来上网找报告,大家几乎都是用double来开数组的,其实不用double
阅读全文
摘要:状态压缩DP(使用位运算加速)这是个经典的状态压缩DP,为加深印象详细写写一下报告,由于是中文题目所以不说题意了思考方法:首先,一个炮的攻击有两行,所以对于第i行来讲,i-1行和i-2行对它有影响,i-3行及以上的都没有影响了,所以我们要得到第i行的信息,只需要知道i-1和i-2的信息(最近有个体会,DP要找到什么因素影响了当前你要求的东西,有影响的我们就处理,没影响的我们不用管)。接着我们就思考怎么表示状态。山用1表示,空地用0表示,空地放了兵也用1表示,那么对于一行,就是一个01的串,这是个二进制数,我们可以想到状态压缩压缩回来一个十进制数。比如原地图01101011,那么0处可以放兵,所
阅读全文
摘要:DP经典问题,石子合并描述:在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。/*石子合并问题由于石子是未成一圈,所以首先我们要把圆圈剪断变成一条直线,而这样的直线有n条(每个石子都可以作为直线的开头)接下来我们就考虑直线的石子合并问题,这个其实就是矩阵链乘法dp[i][j]=min{ dp[i][k]+dp[k+1][j]+cost } cost为本次合并带来的代价,cost=ai+ai+1+ai+2……aj*/#include
阅读全文
摘要:DP(经典题):字符串最短编辑距离关于计算最短编辑距离的资料有很多,这里不详说,这题还要求输出路径,并且注意到是实时的输出,关键在于输出中的那个数字,即位置代码中已经有详细分析/*dp[i][j]表示a串前i个字符和b串前j个字符的最短编辑距离1.dp[i][j]=dp[i-1][j]+1 即先删除a串的第i个字符,然后使其前i-1个字符与b串的前j个字符相同2.dp[i][j]=dp[i][j-1]+1 即先让a串的前i个字符和b串的前j-1个字符相同,然后再在a串后面插入b[j]这个字符3.dp[i][j]=dp[i-1][j-1]+(a[i]==b[j]?0:1) 即先让a串前i-1..
阅读全文
摘要:线段树一样的题目http://www.cnblogs.com/scau20110726/archive/2013/02/24/2923923.html
阅读全文
摘要:线段树(经典题)离散化+成段更新+区间统计题意:先输入case数,每个case输入n,表示下面有n个海报,每行就是海报的左右坐标,第i个海报的颜色为i。一面墙长度固定为10000000,问这些海报贴上去后能看到多少种颜色这个问题的难处其实是怎么离散化(也就是映射,映射后就是简单的线段树整段更新,最后区间询问)。今天第一次学离散化,说说个人的解法方法是和别人的大概一样的,可能代码实现有些不同,我的代码可能空间开销更大些(后来查看代码,很多空间能省略,但是下面的代码是我最原始的代码,并没有后来的优化,就以此来讲解)。int s[MAXN][2]; 保存原始的数据,[0]是起点坐标,[1]是终点坐标
阅读全文
摘要:递推,卡特兰数题意:输入n,表示圆上有n对点也就是2n个点,每个点要与另一个点且只能与一个点相连,用直线将两点相连,那么会产生n条线,但要求这n条线不能出现相交的情况,问有多少种连接方案这个问题并不难,首先我们固定一个点,让它与另外的任意一个点连接,那么这个圆将被分成两份,我们暂且把这条线称为分界线,而两边各有一些点。我们可以很容易的发现,如果一边的点的个数为奇数,那么这一边无论怎么连,都必将剩下一个点没有被连接,这个点一定要越过分界线,也就是一个会出现相交。由于一边是奇数个点,另一边也肯定是奇数个点,会出现相同的情况所以我们得到一个策略,分界线不能随便选,它一定要保证两边的点的个数均是偶数。
阅读全文
摘要:递推/*递推我们要怎么得到n呢,可以考虑n-1的情况,在n-1的情况下我们只需要再放一个2*1的方块即可接着可以考虑n-2的情况,我们可以放入一个2*2的方块即可,或者放入2个2*1的方块接着我们可以考虑n-3的情况,可以放入3个2*1,或者1个2*2和1个2*1,或者1个2*1和1个2*2然后会发现,这样子就重复,n-3的这些情况其实就是n-1和n-2加起来的情况所以可以n只决定于n-1和n-2,易知递推公式为dp[n]=dp[n-1]+2*dp[n-2]*/#include <cstdio>#include <cstring>#define LEN 1010#def
阅读全文
摘要:线段树题意:输出N,T,M,表示总区间长度([1,N]),有T种颜色(1到T表示),接下来有M个操作。C,a,b,c类型的操作是成段更新,把区间[a,b]的颜色改为c。P,a,b类型的操作是询问区间[a,b]有多少种不同的颜色分析都在代码里面了/*成段更新,询问一个区间内有多少种的不同的颜色每次询问之前清空一个颜色的标记数组,然后开始询问,去到一个区间,若val为1说明整段的颜色相同,不用再继续深入,若为0说明颜色不止一种要继续深入。每次val为1时要判断这个颜色col是否已经被记录,只有没被记录的才能计数,而且要记录该颜色已经被用过至于成段更新,要用到LAZY。到达目标区间后不要再继续深入。
阅读全文
摘要:线段树 or 树状数组 or 归并排序一个关于逆序数的问题。输入n,下面给出n个数字,分别是0到n-1,顺序不定。问你逆序数是多少?逆序数就是逆序对的个数,所谓逆序对,就是一个序列中任取两个数字,若i<j,a[i]>a[j],则称a[i]和a[j]是一个逆序对,好像3,1,4,2,逆序对有(3,1),(3,2),(4,2),所以逆序数为3但题目还没完,它还需要移动,每次将序列的第一个元素放在序列的最后,得到的新序列再求一次逆序数,可知一个长度为n的序列这样的移动可以做n-1次,可以得到n-1个新的序列,(第n次的话就会变回原始的序列)。然后问你,原序列和n-1个新序列中最小的逆序数
阅读全文
摘要:最短路 OR 搜索这题大多数是归为图论题,求最短路径,看了一下题目,确实是这样的意思,但是我却很难想到怎么最短路。后来觉得搜索更形象易懂所以写了一个dfs,但是wa,然后看了一下解题报告才发现有个地方理解错题意了。根据题意做了小修改就过了题意:其实就是找一条最短路径,但是路径中任意两个点的等价差不能超过限制值(我一开始的理解是两个直接相连的点的等级差不能超过限制值)/*建图:一个物品就是一个点,一个物品能容另一种物品来换,那么就是两个物品间可能相连,为什么是可能,因为还要两个物品的等级满足条件。因为物品数上限为100,用邻接矩阵来建图方便。再注意一点,这是个有向图,要得到i物品可以用j物品来换
阅读全文
摘要:最短路变形题意:输入n和m表示图的顶点数和边数然后下面m行给出每条边的信息(无向图)。起点是办公室编号1,终点时家编号2。从1到2,问满足要求的路径条数。要求就是,该条路径经过A点到B点的话,那么经过B点到家的最短路径值要小于A点到家的最短路径值,关于这句话是什么意思,看下面的注释还好是1A了这题,否则的话感觉要调试很久//先以家为源点运行一次dij得到家到每个点的最短路(也就是每个点到家的最短路)//那么从办公室到家的最短路(一条或多条)一定符合题目的要求,因为最短路本身有最优子结构的性质//还有一些路径,不是办公室到家的最短路,但是它符合题目的要求//例如办公室为O,家为H,从O到H的最短
阅读全文