01 2018 档案
摘要:URAL 1513 思路: dp+高精度 状态:dp[i][j]表示长度为i末尾连续j个L的方案数 初始状态:dp[0][0]=1 状态转移:dp[i][j]=dp[i-1][j-1](0<=j<=k) dp[i][0]=∑dp[i-1][j](0<=j<=k) 目标状态:dp[n+1][0] 观察
阅读全文
摘要:URAL 1287 思路:dp水题,四个方向转移,题目卡了内存,应该只能这么写。 代码:
阅读全文
摘要:URAL 1501 思路: dp+记忆化搜索 状态:dp[i][j]表示选取第一堆前i个和第二堆前j的状态:0:0多1个 1:0和1相等 2:1多一个 -2:不能达到题目所描述的状态 初始状态:dp[0][0]=1 状态转移:见代码 代码:
阅读全文
摘要:URAL 1018 思路: 树形dp+记忆化搜索 先把边的权值转移到节点上 状态:dp[i][j]表示以i为根节点的子树中选取j个节点保留(包括自身)的最大苹果数 目标状态:dp[1][q+1] 初始状态:dp[i][0]=0(1<=i<=n) dp[i][m]=w[i](i is a leaf,
阅读全文
摘要:URAL 1029 思路: dp+记录路径 状态:dp[i][j]表示到(i,j)这个位置为止的最少花费 初始状态:dp[1][i]=a[1][i](1<=i<=m) 状态转移:dp[i][j]=a[i][j]+max(dp[i-1][j],dp[i][j-1],dp[i][j+1])(注意扫的方向
阅读全文
摘要:URAL 1039 思路: 树形dp 状态:dp[i][0]表示以i为根节点的子树不选取i的最大贡献 dp[i][1]表示以i为根节点的子树选取i的最大贡献 初始状态:dp[i][0]=0(if i is a leaf) dp[i][1]=a[i](if i is a leaf) 状态转移: dp[
阅读全文
摘要:URAL 1078 思路: dp+记忆化搜索 状态:dp[i]表示第i个线段最多包含多少个线段(包括自身) 状态转移:dp[i]=max(dp[i],1+dp[j])线段j包含于i 记录路径,递归输出路径 代码:
阅读全文
摘要:918D - MADMAX 思路: dp+记忆化搜索 状态:dp[i][j][w]表示先手在i节点,后手在j节点,这一轮的字母为w的结果,如果为true,则表示先手必赢,否则后手必赢。 状态转移:如果i连的一条边的权值tw>=w,连向t,那么这个博弈的结果可以由dp[j][t][tw]决定,如果dp
阅读全文
摘要:918C - The Monster 思路1: 右键在新窗口打开图片 代码: 思路2: 结论: 证明见codeforces.com/blog/entry/57420 代码:
阅读全文
摘要:URAL 1495 思路: 折半枚举+高精度技巧。 先dfs枚举出小于等于15位的情况。 dp[i]表示余数为i的最小的数。 _dp[i]表示余数为i正好15的数。 然后枚举余数i,把它乘以1e15再模n后得到t,然后找_dp[n-t] 代码:
阅读全文
摘要:URAL 1244 思路:dp,有点类似背包,不过不需要求最大价值,只要求方案数就可以了。 状态:dp[i]表示和为i的方案数 初始状态:dp[0]=1 状态转移:dp[i]=∑dp[i-a[k]] (1<=k<=n) 用一个pre[]数组来记录路径 代码:
阅读全文
摘要:URAL 1658 思路: dp+记录路径 状态:dp[i][j]表示s1为i,s2为j的最小位数 初始状态:dp[0][0]=0 状态转移:dp[i][j]=min(dp[i-k][j-k*k]+1,dp[i][j])(0<=k<10) 在状态转移时用一个数组v[i][j]记录选的k 代码:
阅读全文
摘要:URAL 1081 思路 状态:dp[i]表示长度为i的方案数 初始状态:dp[0]=1,dp[1]=2 状态转移:dp[i]=dp[i-1]+dp[i-2],在长度为i-1的串的前面加0,在长度为i-2的串前面加10 对于第i位如果k大于dp[i-1],那么说明这一位时1(k减去dp[i-1]),
阅读全文
摘要:URAL 1303 思路: dp+贪心,然后记录路径 mx[i]表示从i开始最大可以到的位置 sufmx[i]表从1-i的某个位置开始最大可以到达的位置 比普通的贪心效率要高很多 代码:
阅读全文
摘要:URAL 1183 思路:区间dp,打印路径,详见http://www.cnblogs.com/widsom/p/8321670.html 代码:
阅读全文
摘要:454D - Little Pony and Harmony Chest 思路: 状压dp,由于1的时候肯定满足题意,而ai最大是30,所以只要大于等于59都可以用1替换,所以答案在1到59之间 然后筛出1到58之间的质数,只有16个,把1到58的数的状态由这16个质数表示,如果整除这个质数则二进制
阅读全文
摘要:454C - Little Pony and Expected Maximum 思路: m面的骰子掷n次,总共有m^n种情况,如果一种情况的最大值是m,那么它肯定包含m,那我们在所有情况下挖掉不包含m的情况:(m-1)^n,所以最大值是m的情况数是m^n-(m-1)^n,同理可得最大值是m-1的情况
阅读全文
摘要:URAL 2072 思路: dp+离散化 由于湿度的范围很大,所以将湿度离散化 可以证明,先到一种湿度的最左端或者最右端,然后结束于最右端或最左端最优,因为如果结束于中间,肯定有重复走的路 状态:dp[i][0]表示湿度为i结束于左端最优的步数 dp[i][1]表示湿度为i结束于右端最优的步数 初始
阅读全文
摘要:URAL 1152 思路: 1.状压dp+记忆化搜索 代码: 2.dfs+剪枝 代码:
阅读全文
摘要:D - The Child and Zoo 思路: 并查集+贪心 每条边的权值可以用min(a[u],a[v])来表示,然后按边的权值从大到小排序 然后用并查集从大的边开始合并,因为你要合并的这两个联通块之间的点肯定要经过这条边,而这条要合并的边是所有已经合并中的最小的,所以两个联通块之间的所有点之
阅读全文
摘要:URAL 1635 思路:区间dp+贪心,先n^2处理出每段区间是否是回文串,然后贪心地找每一段1到i的最少分割。 代码:
阅读全文
摘要:URAL - 1017 状态:dp[i][j]表示和为i最大数小于等于j的方案数 初始状态:dp[0][0]=1 状态转移:dp[i][j]=dp[i-j][j-1]+dp[i][j-1],i>=j 第二维可以用滚动数组消掉 最后减去和为n最大值也为n的情况,因为这种不满足条件 代码:
阅读全文
摘要:912E - Prime Gift 思路: 折半枚举+二分check 将素数分成两个集合(最好按奇偶位置来,保证两集合个数相近),这样每个集合枚举出来的小于1e18的积个数小于1e6。 然后二分答案,check时枚举其中一个集合,然后找到另外一个集合小于mid/该元素的元素有多少个,这里用到一个双指
阅读全文
摘要:911E - Stack Sorting 思路: 用栈来模拟,能pop就pop,记下一个需要pop的数为temp,那么如果栈非空,栈顶肯定大于temp,那么加入栈 栈顶值-1 到 temp 的值,否则加入栈 n 到 temp 的值,如果需要加入的数之前已经出现过,答案则不存在。 代码:
阅读全文
摘要:294D - Shaass and Painter Robot 思路: 可以用数学归纳法证明一个结论:整个棋盘黑白相间当且仅当边缘黑白相间。 分奇偶讨论又可得出边缘黑色格个数为n+m-2 这样就可以暴力模拟。 数组开不下保存边缘块有没有被访问,可以用map。 代码:
阅读全文
摘要:448E - Divisors 思路: dfs。注意如果是1,直接返回,因为1的因子还是1。 因为x因子的因子还是x的因子,所以可以事先处理好x因子的因子在x因子中的位置。 不用这个方法也可以,用map映射vector保存因子的因子。 代码1: 代码2:
阅读全文
摘要:hihoCoder 1513 小Hi的烦恼 思路: 用bitset判断交集个数 代码: 参考:http://www.cnblogs.com/hua-dong/p/8196081.html
阅读全文
摘要:https://www.nowcoder.com/acm/contest/67/D 思路: 先手动模拟一下过程,以下是模拟过程,按顺序表示第几步需要移动的盘标号 1 1 2 1 1 2 1 1 3 1 1 2 1 1 2 1 1 3 1 1 2 1 1 2 1 1 4 1 1 2 。。。。。。 我们
阅读全文
摘要:https://www.nowcoder.com/acm/contest/67/E 思路: dfs 代码:
阅读全文
摘要:https://www.nowcoder.com/acm/contest/67/G 思路: 分形。 记录中间左边点的坐标,然后推出另外3个点的坐标,递归到最简单的情况。 代码:
阅读全文
摘要:https://www.nowcoder.com/acm/contest/67/C 思路: 模拟。 代码:
阅读全文
摘要:hihoCoder 1636 Pangu and Stones 思路:区间dp. 状态:dp[i][j][k]表示i到j区间合并成k堆石子所需的最小花费。 初始状态:dp[i][j][j-i+1]=0 状态转移: 如果k等于1,dp[i][j][1]=min(dp[i][j][1],dp[i][k]
阅读全文
摘要:1.石子归并问题 dp[i][j]表示区间i到j合并所需的最小花费。 先求出小区间的最小花费,再转移到大的区间。 转移方程:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]) 初始状态:dp[i][i]=0 模板: 2.括号匹配问题 求最大括号匹配数 dp[i][j
阅读全文
摘要:概述:用倍增法求区间最值的离线算法,O(nlogn)预处理,O(1)访问。 预处理: 状态:st[i][j]:[i,i+2^j)之间的最值 状态转移:如果j等于0,st[i][j]=a[i] 如果j大于0,st[i][j]=max(st[i][j-1],st[i+2^(j-1)][j-1])或st[
阅读全文
摘要:916C - Jamie and Interesting Graph 思路:构造。 对于1到n最短路且素数,那么1到n之间连2 对于最小生成树,找一个稍微大点的素数(比1e5大)构造一个和为这个素数的最小生成树 剩下的边都连1e9 代码:
阅读全文
摘要:思路: 先取出二进制的每一位,判断总个数是不是小于等于k,如果大于k则不能构成。 通过观察可以发现,每一位的一个可以转换成下一位的两个,因为要使最大位尽可能小,所以如果最大位的所有的个数都可以转换成下一位那么就全部转换过去,如果不能就一个也不要转换,不然会导致字典序损失。 然后从最小的位开始转换,每
阅读全文
摘要:474D - Flowers 思路:dp. dp[i]表示长度为i的方案数 显然,当i<k时,dp[i]=1 当i>=k时,dp[i]可以由dp[i-1]加上一朵红花转移过来,由dp[i-k]加上k朵白花转移过来,所以dp[i]=dp[i-1]+dp[i-k] 代码:
阅读全文
摘要:431C - k-Tree 思路:dp. dp[i][j][s] 如果s为1,表示第i层长度为j且至少包含一段>=d的距离的路径数 如果s为0,表示第i层长度为j且不包含一段>=d的距离的路径数 状态转移看代码 代码:
阅读全文
摘要:913C - Party Lemonade 思路:对于第i个话费cost[i],取min(cost[i],2*cost[i-1]),从前往后更新,这样就可以保证第n个的话费的性价比最高,那么从最高位开始贪心,取最优解。 代码:
阅读全文
摘要:913D - Too Easy Problems 思路:二分check k 代码:
阅读全文
摘要:279B - Books 思路:尺取法求和小于等于t最长的一段的长度。 代码:
阅读全文
摘要:710E - Generate a String 思路:dp。 dp[i]表示产生长度为i的串的最少花费。 边界:dp[1]=x。 如果i是偶数,dp[i]只需要由dp[i-1]或者dp[i/2]转移过来,因为如果是由dp[i+1]转移过来,那么dp[i+1]要对答案产生贡献肯定是由dp[i+2]转
阅读全文

浙公网安备 33010602011771号