摘要: 最长公共子序列。 设f[i][j]为前第一个序列前i和第二个序列前j的最长公共子序列。 f[i][j]=f[i-1][j-1] (a[i]=b[j]) f[i][j]=max(f[i-1][j],f[i][j-1]) (a[i]!=b[j]) 阅读全文
posted @ 2018-01-23 16:00 TrassBlose 阅读(114) 评论(0) 推荐(0) 编辑
摘要: 正反做两次最长上升子序列。 记f[i]为正着做以Ti为结尾的最长上升子序列。 记g[i]为倒着做以Ti为结尾的最长上升子序列。 答案就是n-max(f[i]+g[i]-1)。 阅读全文
posted @ 2018-01-23 15:02 TrassBlose 阅读(81) 评论(0) 推荐(0) 编辑
摘要: 并查集模板,习惯并查集都加路径压缩优化。 阅读全文
posted @ 2018-01-22 18:30 TrassBlose 阅读(111) 评论(0) 推荐(0) 编辑
摘要: 经典桶排题。 用一个桶记录某个数是否出现过。 或者使用C++自带的unique函数。 它需要先sort。 然后用此函数去重,返回的是去重后最后一个数的后面一位的地址。 阅读全文
posted @ 2018-01-22 17:14 TrassBlose 阅读(98) 评论(0) 推荐(0) 编辑
摘要: 简单模拟。 阅读全文
posted @ 2018-01-22 17:04 TrassBlose 阅读(67) 评论(0) 推荐(0) 编辑
摘要: 简单的深搜加上判断是否是质数。 由于是组合,所以要考虑顺序,不然会超时。 其实可以用状压的方法来递推。 f[i]表示状态为i时数的和是多少。 阅读全文
posted @ 2018-01-22 17:02 TrassBlose 阅读(106) 评论(0) 推荐(0) 编辑
摘要: 首先用个桶统计一下每个数出现多少次。 然后用类似埃氏筛法的方法统计每个数有多少个倍数,对于存在每一种倍数个数的数取一个max。 最后递推一下答案即可。 阅读全文
posted @ 2018-01-22 16:36 TrassBlose 阅读(82) 评论(0) 推荐(0) 编辑
摘要: 贪心,每次取最小的两个合并即可。 优先队列,懒惰就是美德。 单调队列,开两个队列,一个放没有合并过的果子堆,另一个放合并过的果子堆。 由于合并出来的果子堆是从小到大合并出来的,所以直接放队列尾部即可。 阅读全文
posted @ 2018-01-22 16:17 TrassBlose 阅读(94) 评论(0) 推荐(0) 编辑
摘要: 一道伟大的题。 阅读全文
posted @ 2018-01-22 16:04 TrassBlose 阅读(92) 评论(0) 推荐(0) 编辑
摘要: 直觉告诉我们答案就是[n/k]。 证明: 设答案为w,那么这些学号必然是w,w*2,w*3,w*4...w*k。 于是w*k当为不超过n的最大值,就可以得出w=[n/k]。 阅读全文
posted @ 2018-01-22 15:58 TrassBlose 阅读(117) 评论(0) 推荐(0) 编辑