机试
咕栗
这个作者很懒,什么都没留下…
展开
-
洛谷p1233 木棍加工
传送门 题目 分析 显然,需要先排序 要求两维都要尽可能的按降序排序,容易想到贪心 那么可以先令一维完全满足降序的要求,令另一维有尽可能少的不上升子序列 dilworth定理 把一个数列划分成最少的最长不升子序列的数目就等于这个数列的最长上升子序列的长度 那么问题转换成求另一维的最长上升子序列长度 可以套模板了 代码 #include <iostream> #include <vector> #include <algorithm> using namespace st原创 2021-07-26 12:26:37 · 154 阅读 · 0 评论 -
洛谷p1077 摆花
传送门 题目原创 2021-07-26 10:56:21 · 176 阅读 · 0 评论 -
洛谷p4933 大师
传送门 第一反应可以当成区间dp做,但是由于等差数列会存在公差为负数的情况,导致需要的空间加倍,故换了一种思路 公差可以通过等差数列的最后两项推出,因此只需要知道相邻两项的高度就可以 以f[i][j]表示等差数列以第i项结尾,倒数第二项是j的方案数 f[i][j]=sum(f[j][k])+1,k<j && h[i]-h[j]==h[j]-h[k] 由于只有两项的时候也是合理方案,因此f[i][j]最小为1 由于只有i一项的时候也是合理方案,但不能被任何一个状态包含,所以只能单独处理原创 2021-07-26 10:17:00 · 131 阅读 · 0 评论 -
洛谷p1040 加分二叉树
传送门 看到二叉树,第一反应是区间dp f[i][j]=max(f[i][k-1] * f[k+1][j] + f[k][k]),i<=k<=j 但是在实现的时候突然卡壳了,于是只能求助题解 区间dp的主要思路是迭代区间长度 这里可以将区间长度设为除根节点外子树的总节点数 因此 j=i+len 初始状态将i设为根节点,依次遍历i+1 - j的所有节点 由于存在子树为空的情况,因此要将l>r的分数初始化为1 用root[i][j]存储该子树的根 代码 #include <iostrea原创 2021-07-25 17:59:13 · 176 阅读 · 1 评论 -
洛谷p2758 编辑距离
传送门 f[i][j]表示字符串a的前i位转换成b的前j位需要的最小编辑次数 初始化f[i][0]=f[0][i]=i 有三种操作,所以有三个状态可以转换到f[i][j] f[i-1][j]+1,将前i-1位变成前j位,然后删除第i位 f[i][j-1]+1,将前i位变成前j-1位,然后插入第j位的字符 f[i-1][j-1]+(a[i]!=b[j]),假如两位相等,则无需操作,否则需要把前i-1位变成前j-1位,并且把第i位变成第j位 代码 #include <iostream> #inclu原创 2021-07-25 17:08:06 · 124 阅读 · 0 评论 -
洛谷p1280 尼克的任务
传送门 线性dp 开始以为是一个分组背包问题,后来发现我不知道怎么分组……。又想到区间问题,但是还是没有思路,遂看题解 正推 memset(f, -0x3f, sizeof f); f[1] = 0; for(int i = 1;i <= n;i++){ if(tasks[i].empty()){ //可能已经更新过了,不能直接用前一状态更新 f[i + 1] = max(f[i] + 1, f[i + 1]); continue; } for(int j = 0原创 2021-07-25 15:41:01 · 107 阅读 · 0 评论 -
洛谷p2196 挖地雷
传送门 N <=20,想到了状压。 f[i][j]表示在走过的点状态为i的情况下以j结尾的最大收获,pre[i][j]表示在前述状态下前一个点的编号。初始化pre数组为-1表示结束(我使用了0 - n-1作为节点的编号,使用1-n就不需要初始化) 状态转移方程 f[i][j] = max(f[i-1<<j][k]+f[1<<j][j]),((i-1<<j)&(1<<k)==1)&&graph[k][j]==1 遍历时每遍历到一个状原创 2021-07-24 21:28:35 · 131 阅读 · 0 评论 -
洛谷p1020 导弹拦截
传送门 经典的上升子序列和不上升子序列问题,模板题 lower_bound && upper_bound lower_bound,查找升序序列中第一个大于等于x的数位置 upper_bound,查找升序序列中第一个大于x的数位置 降序怎么办,用greater() 不上升子序列O(nlogn) 维护一个栈(单调栈) 假如该数可以放到最后面,就直接放到最后面 否则,这个数其实可以扔掉 但为了避免应该选这个数而不选中间的数,给后面更大的容错空间 用这个数替代比他大的第一个数 同时又不会导致栈的大小原创 2021-07-24 21:26:31 · 120 阅读 · 0 评论 -
洛谷p1439 最长子序列
传送门 规模10^5,经典的模板题,但是还要优化 普通最长公共子序列思路: 当p1[i]与p2[j]不相等时:dp[i][j]=max(dp[i-1][j], dp[i][j - 1]) 当p1[i]与p2[j]相等时:dp[i][j]=max(dp[i-1][j], dp[i][j - 1], dp[i-1][j-1]+1) 刚开始直接开了一个N*N的数组,结果报错,百度都搜不到的报错信息,最后发现是数组开太大了,搞了一个滚动数组,很快乐的通过了样例就交了,结果就TLE了orz 然后看到了大佬的题解,拜服原创 2021-07-24 21:23:57 · 154 阅读 · 0 评论 -
机试刷题目录
文章目录dp状态压缩子序列 dp 状态压缩 洛谷p2196 挖地雷 子序列 洛谷p1020 导弹拦截 洛谷p1439 最长公共子序列原创 2021-07-24 21:19:20 · 269 阅读 · 1 评论