自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

untilyouydc

You don’t think other people’s understandings as the nuts and bolts in that you are yourself of great account and proud as a kin

  • 博客(61)
  • 收藏
  • 关注

原创 Tree Cutting HDU - 5909 (树形dp + 树分治)

思路:第二道树分治题,但这题首先要先解决dp的递推表达式。首先先确定一点,同一子树上的dfs序一定是连续的,这也就给了我们一个将树上的dp映射到普通dp上(普通dp我们研究的元素之间通常是连续的)。换句话说,按dfs序的话,我们就可以考虑前i项构成的子树这样的情况,如果不是dfs序,那么前i项可能在不同子树,这与题目要求不符。设dp[i][j]表示考虑了dfs序的前i项,目前连通块的异或和...

2018-09-30 23:57:19 293

原创 Tree POJ - 1741 (树分治入门)

参考论文:https://wenku.baidu.com/view/8861df38376baf1ffc4fada8.html这题的两个关键部分: 1. 求出树的重心(这在之前的博客里面提到,不在叙述)2. 如何进行分治。首先,如果我们选定一个点作为根节点,那么一条路径要么经过这个根节点,要么不经过这个根节点。题目要求出所有路径小于等于k的路径,我们可以这样考虑(先不考虑重复的),...

2018-09-30 14:38:32 635

原创 Enigma Gym - 101889E(数位dp+记录路径)

思路:按数位dp的枚举思路,当遇到第一个满足的就直接return .注意边界条件就行。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int MAXN = 1e4+10;char s[1005];int n;int mod;int a[1005];int dp[...

2018-09-30 00:12:48 335

原创 Longest Increasing Subsequence HDU - 6284 (LIS+区间分解)

思路:因为改变的数是同一个,所以最后对LIS的贡献最多只能是1,所以可以先求出最长上升子序列长度,然后每个改变的数,考虑它对LIS的加成是1还是0.设a[i]表示已第i项结束的最长上升子序列长度,b[i]表示以第i项为起点的最长上升子序列长度。考虑在0的左边找一个a[i],在0的右边找一个b[j](并且c[i]<c[j]),如果a[i]+b[j]==L,那么将这个0改成其他数字,就有...

2018-09-29 12:58:18 347

原创 Math teacher's homework UVA - 1489 (脑跑数位dp +组合计数)

网上对这题的分析寥寥无几,分析的更是惨不忍睹,让人望而生畏。我参考的博客  他写的思路是有道理的,但不看几个小时是无法理解的。我的想法:首先这题,你不可能像别的数位dp一样,真的去dfs写出了,因为它是个计算方案数的问题,并且可选的数有n个。但它还是一个数位dp,为什么?因为它还是利用了枚举位的思想去解决。首先第一个思想:它最后要求要异或值为k,我们可以转换一下思路,我们不盯着最后...

2018-09-29 08:33:51 345

原创 Apocalypse Someday POJ - 3208 (数位dp+二分)

思路:dp[i][fpre][pre][sta]表示前i为,前面两个数分别为fpre,pre,状态为sta的满足题意的个数。二分出一个相近的数,然后一个个实验就行。代码:#include <iostream>#include <algorithm>#include <string>#include <string.h>#incl...

2018-09-28 16:37:49 220

原创 Bits Problem HDU - 5106 (数位dp)

思路:这题和A Math Problem HihoCoder - 1259的解决方法非常类似。这个问题其实可以考虑分解成两个子问题,第一:前i位数中有多少个数满足有n个1,第二:前i位数中,满足条件的和。对于问题1,一般的思路是:dp[i][j]表示前i位,含有1的个数为j的有多少个,dfs时,判断j==k就行了。但是这样明显有一个缺点,那就是不能记忆化,因为当第二次k的值和第1次不同...

2018-09-28 15:10:51 142

原创 A Math Problem HihoCoder - 1259 (数位dp+推公式)

思路:先根据公式中,3f(n)和1+3f(n)互质的关系,列出等式,可以推出,f(n)是一个3进制数。所以dp的时候按三进制展开就行。因为模数不定,所以每次都要把模数传进去,其次对于f%k==t,考虑将其转化成(f-t)%k==0,这样就可以放dp里面记忆化。dp[mod][re][pos]表示第pos为余数为re,模数为mod.代码:#include <bits/st...

2018-09-28 00:36:26 175

原创 A serious math problem HDU - 5435 (数位dp+大数+计数问题)

思路:每一位取值只能是0到9,可以证明0到9中的数进行异或操作,不管多少个数进行异或,最后的值都不可能超过16,因为16转化为二进制是10000,已经是5位二进制数了,最坏情况是4位都是1,1111==15。所以我们可以利用这个关系,解决和太大,无法利用dp记忆化的问题。也就是说求异或和的问题,转化成了一个,先求出最后答案为0-15的异或值有多少个的问题,只要计算出每种异或值有多少个,求总和只...

2018-09-27 22:58:15 183

原创 汇编实验一 用表格形式显示字符

基础知识:1. 汇编中的几个常用标志符号  CF是进位标志, PF是奇偶标志 AF是辅助进位标志 ZF是零标志 SF是符号标志 OF是溢出标志.2. cmp 的使用 cmp 是将两个操作数进行相减,但是不保存结果,只保存相关的标志(AF,ZF等),有了这些标志,可以辅助于转移语句中。 3. 条件转移指令及转移条件  je     等于则转移        ...

2018-09-27 14:59:57 3023

原创 Optimal Array Multiplication Sequence UVA - 348(矩阵连乘问题,区间dp+记录路径)

思路:要求乘的次数最小,分析子最优子结构:任意一个区间的最小乘次数,取决于先乘那几个(等价于最后乘那两个),所以思路就是去枚举最后乘的那个就行。状态转移方程:dp[i][j]=min(dp[i][k]+dp[k+1][j]+a[i]*b[k]*b[j]) k>=i&&k<j;难点在于如何输出路径:可以在计算最小值的时候,记录枚举出的最小的k,也就是说dp[i...

2018-09-26 19:06:47 231

原创 Optimal Binary Search Tree UVA - 10304(区间dp +前缀和)

思路:一个很明显是思路是,在i到j区间内枚举k,让k成为根节点。这样做是否满足最优子结构和无后效性?答案是肯定的,首先在任意一个子区间的最小值,都对最后答案有恭喜,其次,当前区间的最小值,和后面的元素,没有关系。知道了枚举根节点的思路后,还有一个问题,那就是当k成为根节点以后,答案的变化是怎么的?首先,当k成为根节点后,它的贡献是0,其次,其他点的深度应该+1,也就是每个点的值要加一倍,所以求...

2018-09-26 09:10:39 160

原创 Exploring Pyramids UVA - 1362 (区间dp+计数)

思路:这题的关键是去枚举回到根节点的点,要求回到根节点的点必须和根节点相同(因为每种字母只要一个,相等必须回去)。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=3e2+7;const int mod=1e9;char s[maxn];ll dp[...

2018-09-25 22:54:56 164

原创 The Child and Polygon CodeForces - 437E (计算几何+记忆化搜索)

思路:先将点按顺时针或逆时针排序。对于从i点到j点之间的方法数,考虑枚举中间点k,前提是k必须在i和j的中间(利用叉乘的正负值就可以判断)dp[i][j]+=dp[i]k]*dp[k+1][j];代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=2e2+7...

2018-09-25 21:36:21 207

原创 操作系统第二章知识点总结

1. 程序和进程的概念    (1)程序:以进程的方式运行,静态    (2)进程:动态的执行程序的过程。进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。    (3)程序在执行过程中在单道批处理系统和多道批处理系统中的满足的性质不同:             A:在单道批中,满足顺序性,封闭性,可再现性             B...

2018-09-25 21:12:54 1219

原创 Sit sit sit HDU - 5151 (区间dp +组合计数)

这道这道区间DP,我也开始觉得其实区间DP是一种应用型的思想,做这类题目一个重要的点是在于题目情景的把握,这道题的一个情景就是数学的排列组合问题. 首先应用根据小区间推出大区间的思路,我们可以先固定一个位置k,k位置是最后做的位置,那么我们要算出在这种情况下符合的方法数,假如k是头或者尾,那不用说, 此时的方法为dp[i+1][j]或者是dp[i][j-1]; 假如k是有邻居的,那我们就要考虑邻...

2018-09-24 15:23:00 302

原创 Expression HDU - 5396 (区间dp +组合计数)

题目大意:给你一个n然后是n个数。 然后是n-1个操作符,操作符是插入在两个数字之间的。 由于你不同的运算顺序,会产生不同的结果。比如:1 + 1 * 2 有两种  (1+1)*2   或者  1+(1*2)1 *  2 * 3  也是两种即使结果是一样的  (1*2)*3  或者 1*(2*3)问这所有不同的组合加起来的和对 1e9+7取余是多少。 这个其实就是区间...

2018-09-24 13:55:43 181

原创 Distinct Subsequences UVA - 10069(dp+大数)

思路:dp[i][j]表示a的前i个字符中,可以构成b的前j个字符的数量dp[i][j]=dp[i-1][j],if(a[i]==b[j] )  dp[i][j]+=dp[i-1][j-1]只要搞定这个递推就行,大数的话,直接套模板代码:#include <cstdio>#include <cstdlib>#include <cstring&...

2018-09-24 11:23:59 165

原创 Wavio Sequence UVA - 10534 (LIS 裸题)

思路:求出以i结尾的递增序列长度和以i开始的最长递减序列长度,然后便历一遍就OK代码:#include <bits/stdc++.h>using namespace std;const int maxn=1e5+7;const int inf=0x3f3f3f3f;typedef long long ll;struct LIS{ int n,s[maxn]...

2018-09-24 10:30:12 111

原创 Prince and Princess UVA - 10635 (n*logn 的最长公共子序列)

思路:求两个串的最长公共子序列,将其转化成求最长上升子序列。转化方法:将第一个串按顺序编号,将第二个串HASH,然后求hash后的串的最长上升子序列。代码:#include <bits/stdc++.h>using namespace std;const int maxn=1e5+7;const int inf=0x3f3f3f3f;typedef long lo...

2018-09-24 10:07:33 140

原创 Strings UVA - 11081 (dp计数)

参考博客:http://www.cnblogs.com/yuzhaoxin/archive/2012/05/04/2483259.html思路:三维dp,dp[i][j][k]表示第一个字符串的前i个,第二个字符串的前j个,组成了第3个字符串的前k个的方法数量。分别考虑s1[i]==s3[k]和s2[j]==s3[k]对答案的影响就行。具体分析看上面的参考博客感觉这个dp非常的难想。...

2018-09-23 22:59:05 107

原创 Robots(II) UVA - 10599 (转化成LIS)

思路: 因为不需要知道路径,所以我们没必要一个个点去走,只要把有垃圾的点全都找出来就行,所以用了一个数组g,g[i]表示第i个垃圾的编号,然后我们开始最长增长子序列求序列长,如果i可以在j捡了后捡,那么必须满足一个条件,就是i在j的右边.就是纵坐标要i >= j ; 还有一点要特别注意,就是因为最后一定要走到终点,可是终点不一定有垃圾啊.所以我们要手动给终点放一个,然后在最后算的时候减掉.(...

2018-09-23 22:09:47 114

原创 Cyborg Genes UVA - 10723 (最长公共子序列变形)

思路:求长度最少的串的思想和求最长公共子串基本一致,dp[i][j]即可。求数量,则借助于前面的dp[i][j]。具体思路看代码:#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <cstdlib>usin...

2018-09-23 20:32:38 160

原创 Happy Birthday UVA - 12002(LIS变形)

这题和HDU4640非常像。思路:预处理求以i点为起点的最长上升子序列和最长下降子序列.(求法可以直接n^2)依次枚举i,以i为起点的最长上升+比a[i]小的最长下降 。或者以i为起点的最长下降+比a[i]大的最长上升,都是满足题意的。代码:#include <bits/stdc++.h>using namespace std;typedef long long ...

2018-09-23 15:45:53 150

原创 LIS of Sequence CodeForces - 486E(LIS+找规律)

首先,我们计算出以a[i]结束的前缀的LIS长度---f1[i]    以a[i]开始的后缀的LIS长度---f2[i] 然后,如果f1[i] + f2[i] - 1 < LIS,显然a[i]不属于任何一个LIS。否则,如果有重复的(f1[i],f2[i]),那么a[i]不属于每一个LIS。否则,a[i]属于每一个LIS。记录是否有重复,开个map就好了。代码:#i...

2018-09-23 14:16:06 284

原创 CRB and Apple HDU - 5406(双线LIS+多颗数组数组优化)

思路首先,考虑第1个LIS的最后一项是i,第二个LIS的最后一项是j。可以这样考虑状态转移d[i][j]=max(dp[i][k](k#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e3+7;const int inf=0x3f3f3f3f;int n;in...

2018-09-22 23:09:37 221

原创 Removed Interval HDU - 5489(LIS+线段树加速)

思路一般的思路:先预处理得到f[i]以i结尾的最长上升子序列,g[i]以i开始的最长上升子序列。然后枚举去掉的L,从L+1项开始,那么答案应该是max(f[1]....f[i-L])+g[i]。所以问题的关键转化为求前i-L项中,小于a[i],并且f[]最大的值。对于小于a[i[这个条件,我们可以考虑使用离散化来实现(离散化后,只找它前面的项就可以保证),对于找最大值,那直接线段树或树状数组...

2018-09-22 00:39:15 201

原创 Deque HDU - 4604(LIS)

思路等价于求从点i开始的最长上升子序列和最长递减子序列的长度之和(需要注意去重)。之所以这样考虑是因为:在i之后,比i大的数都可以放在i的后面,比i小的数都可以放在i的前面。求解方法:二分找,这样复杂度到了n*logn,同时要注意去重,去重的方法可以这样考虑,对数a[i],在找最长上升的时候用 a[i]去找,找最长下降的时候,用-(a[i]+1),只有考虑边界点的去重情况,因为中间不可能存...

2018-09-21 23:05:33 189

原创 Almost Sorted Array HDU - 5532(n*longn 的最长上升子序列)

思路用二分的思想求最长上升子序列,对于最长下降子序列,反过来再求一次最长上升就行了。代码#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e5+7;int n;int a[maxn];int dp[maxn],dp2[maxn];int main(){...

2018-09-21 18:41:50 180

原创 String HDU - 4681(最长公共子序列+暴力枚举)

思路在a,b,串中找到含有c串的序列,含有c串的序列必然不能取,所以只要确定了这样的序列,在两边分别找最长公共子序列+c的长度即可。由题目可知,C一定是A和B的子序列,那么先假设C在A和B中只有一个子序列,看下面例子:abcdefdegacebdfghcf可以看到"cf"在A串的[3, 6]区间内, 在B串的[2,6]区间(黄色背景)因为所求的C是D的子串,所以在该黄色区间内的其他字...

2018-09-21 14:24:14 907

原创 Tower of Cubes UVA - 10051(DAG 上dp)

思路将六个面分成3个点对,这样就成了二元关系上的DAG,分别枚举以那个面作为入点(对面作为出点),找到最长的路径,同时记录下一个点就可以打印路径。dp[i][j]表示从第i个的第j面开始的最长路径.代码:#include <bits/stdc++.h>using namespace std;const int maxn=1e5+7;typedef long long ll...

2018-09-21 12:13:47 133

原创 Stacking Boxes UVA - 103(DAG上的dp)

思路方法和刘汝家介绍的一样,先利用关系建图,然后dp计算从每个点开始的最大长度。需要注意的是,建图之前需要将各个维度从小到大进行排序。进行排序可以保证建图的完整性。#include <bits/stdc++.h>using namespace std;const int maxn=1e5+7;typedef long long ll;int n,k;int tmp[40]...

2018-09-21 10:12:40 141

原创 Tour UVA - 1347 双调欧几里得旅行商问题(dp)

思路按照紫书的算法思路:考虑两个人同时从1点出发,走不同的路,到达n点。当一个人走到n-1点的时候,最后还需要走的路径是显然的,因为已经按x轴排好序,所以还要走的最小路径必然是dist(n-1,n)+dist(j,n) :j表示当第一个人走到n-1时,第二个人走到了j点,那么边界条件就被确定了。下面考虑递推:dp[i][j]表示第一个人在i点,第二个人在j点时,还需走的最小路程。那么dp[...

2018-09-20 21:22:04 347

原创 方格取数(1) HDU - 1565(状压dp)

思路先暴力找出满足没有相邻1的的二进制状态。预处理出第i行,状态为k是能得到的值。最后依次递推到第n行即可。代码#include <bits/stdc++.h>using namespace std;typedef long long ll;int n;ll dp[20][20000];int a[21][21];int sta[20000];int cnt;...

2018-09-20 00:01:05 227

原创 棋盘分割 POJ - 1191(暴力枚举型dp)

思路先预处理出前缀和,然后dp[k][x1][y1][x2][y2]表示,切k次,左上角为x1,y1,右下角为x2,y2的矩阵的最小均方差。 然后暴力枚举就行。 代码#include <stdio.h>#include <algorithm>#include <iostream>#include <string.h>#in...

2018-09-14 16:06:12 484

原创 Contestants Division POJ - 3140 (简单树形dp)

#pragma comment(linker, "/STACK:1024000000,1024000000") //加栈#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>#include &lt..

2018-09-13 15:48:08 164

原创 Apple Tree POJ - 2486(三维 树形背包)

思路首先可以想到dp[i][j]表示在i节点可以走j步获得的最大值,其实就是类似于将j步分给它的子节点,树上背包问题。 但是这题还有一个要点,那就是当你分配给子节点一些步数后,可能还会回到i节点,所以需要考虑到底回不回i节点的问题,解决方法就是多加一维记录是否回到i节点。 dp[i][j][0]表示不回,dp[i][j][1]表示回到i节点。 如果要回到i节点,那么就必须多留出2步,如果...

2018-09-13 12:55:50 333

原创 Rebuilding Roads POJ - 1947 (树形dp+背包)

思路dp[i][j]表示以i为根节点剩下j个节点的最少切割次数,将每个点都当成根节点看待,最后只有加上他和父亲节点相连的边+1就行了。 dp[i][1]必然是等于i的子节点数量。代码#pragma comment(linker, "/STACK:1024000000,1024000000") //加栈#include <iostream>#include <...

2018-09-13 11:26:20 170

原创 The Lost House POJ - 2057(树形dp+贪心 (双线最优子结构问题))

思路题意:有一只蜗牛爬上树睡着之后从树上掉下来,发现后面的”房子”却丢在了树上面, 现在这 只蜗牛要求寻找它的房子,它又得从树根开始爬起,现在要求一条路径使得其找到房子 所要爬行的期望距离最小. 爬行距离如下计算, 题目规定每一个分支和枝末都看做是 一个节点, 这些节点之间的距离都是1, 在分支上可能会有热心的毛毛虫, 这些毛毛虫 会如实的告诉蜗...

2018-09-12 23:27:19 183

原创 Palindrome POJ - 1159 (dp+滚动数组)

思路因为n<=5000,n^2的复杂度可以接受。 题目等价于求n- 最长回文子串长度,也等价于求s和s的逆串的最长公共子序列, dp[i][j],即可求出。 考虑到内存问题,状态转移只和前一个i有关,所以直接记录前面一个状态就行。代码#include <stdio.h>#include <algorithm>#include <iost...

2018-09-12 19:39:39 127

空空如也

空空如也

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

TA关注的人

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