随笔分类 - 动态规划
摘要:【链接】 "我是链接,点我呀:)" 【题意】 【题解】 模拟了一两下。。 然后发现。 对于每一个前缀。 组成的新的最小字典序的字符串 要么是s[i]+reverse(前i 1个字符经过操作形成的最大字典序的字符串);或者是 (前i 1个字符经过操作形成的最小字典序的字符串)+s[i] 因为最大字典序
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 【题解】 因为只有1和2. 所以最后肯定是若干个1接着若干个2的情况。 即11...11222...222这样的。 1.首先考虑没有翻转的情况。 那么就直接枚举1和2的边界i在什么地方,即1..i全是1,i+1..n全是2. 只需统计某个范围里面1和2的
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 【题解】 动态规划 设dp[i][j]表示前i个数字,选了j个的最小花费。 dp[i][j] = min(dp[k][j 1]+b[i]);//其中a[i] a[k]且ka[k]的位置k才有可能。 复杂度O(N^2) 【代码】 cpp include u
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 Swap操作显然只能对(i 1,i)执行才有用。 不然直接将i翻转以及j翻转 显然比直接交换更优。 那么现在我们就相当于有两种操作。 1.将i翻转 2.将i与i 1交换 可以写个DP。 设dp[i]表示1..i都已经满足s1[i
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 DP 设f[i][j]表示前i个操作,已经匹配了的点的状态集合为j的方案数 对于+操作 有两种情况。 1.这条边作为匹配的边 2.这条边没有作为匹配边 f[i][j] = f[i 1][j (u,v)] + f[i 1][j]
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 给你一棵树。 让你统计其中子树T的数量。 这个子树T要满足最大值和最小值之差小于等于d 树形DP 可以枚举点root为子树的根。 统计以root为根的子树的个数。 根据每个儿子节点选或者不选。 如果选。则看看它是否满足以下条件:
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 每一位显然只要取1..60这些数字。 然后需要保证每个这些数字里面,每个数字所用到的质因子都它所唯一拥有的。别人不能用 因为如果别人用了的话。gcd就不为1了。 因此我们肯定需要记录这些数字的质因子使用情况。 如果第i个位置枚举
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 显然最多1000行的样子。 从上到小做dp 设f[i][j]为前i行,使用了j个红色方块的方案数。 f[1][r] = 1;如果r 0且g 0则f[1][r 1]=1; 然后如果第i+1行不用红色的话。 就只能用绿色了。。 算算
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 注意这k个序列每个都是排列。 如果在每个序列中都满足y出现在x之后的话。 那么我们从x连一条有向边至y (有一个序列不满足就不连 (这就表明最后的序列中x可以紧接着y 最后显然会形成一个有向无环图。 在这个图上求最长链就好了。
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 原题意等价于:给你一个序列(实数的位置没用!)。。你可以改变其中某些元素的位置(插入到某些位置中间。 然后让他变成有序的。 (有序的话,相同的数字就连在一起了 那么求出原序列的一个最长上升子序列。 把除了这个子序列之外的数字再分
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 f[i][j][k]前i个位置,第i个位置放j这个颜色,然后形成了k个联通块的最小花费 分第i个位置有没有已经放颜色两种情况考虑。 如果有放的话。枚举前一个位置的颜色以及前i 1个位置形成的联通块的数目 如果没有放的话。枚举当前
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 区间DP 设f[i][j]表示i..j这个区间变成目标需要的最少染色次数。 f[i][i] = 1 然后考虑f[i][j]的产生方法 1.在i..j中间枚举一个k.然后i..k和k..j分开涂 2.i和j是同时涂的. 对于i和j
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 f[i][j][k]表示第i行前j列刷了k次,最大满意度 f[][j][k]=max{f[i][l][k],f[i][l][k 1]+max{zero(l+1,j),one(l+1,j)} } g[i][j]表示前i行刷了j次的
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 如上图。 显然如果三个正方形。只可能是上面的情况。 则可以处理一下左上角、右上角、左下角、右下角的前缀最大正方形(dp),以及以某一列为底部,某一行为底部的最大正方形和。 然后枚举一下两条分界线就能做出来啦。 细节题。 【代码】
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 tarjan强连通缩点一下。 然后把缩点之后,每个点的钱的数累加起来。 然后从S出发 开始一边做bfs一遍做dp. 最后输出有酒吧的点的dp值中的最大值。 【代码】 cpp / n个点,m条有向边. 把有向图G的环进行缩点; 缩
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 时间是按顺序的。 所以就有单调性啦。 写个DP就好。 设f[i]表示打第i只鼹鼠,最多能打几只鼹鼠。 则如果i和j的距离不超过它们的时间差,那么就可以从j转移到i 即f[i] = max(f[i],f[j]+1) 注意不要写成f
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 ans初值值为a[1..n]中1的个数。 接下来考虑以2为结尾的最长上升子序列的个数。 枚举中间点i. 计算1..i 1中1的个数cnt1。 计算i..n中2的个数cnt2。 ans = max(ans,cnt1+cnt2) 写
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 DP,设f[i]表示第一次到i这个房间的时候传送的次数。 f[1] = 0,f[2] = 2 考虑第i个位置的情况。 它肯定是从i 1这个位置走过来的。 但是第一次走到i 1这个位置的时候。 需要再走回p[i 1],然后回到i
阅读全文
摘要:【链接】 "我是链接,点我呀:)" 【题意】 在这里输入题意 【题解】 如果我们对某一个位置i操作两次的话。 显然结果就和操作一次一样。 因为第一次操作过后1..i这些数字就变成是互质的了。 gcd为1.那么除过之后没有影响的。 然后。就是要明白 那个f(x)函数的意义。其实就是问你x质因数分解之后
阅读全文
摘要:【链接】 我是链接,点我呀:) 【题意】 在这里输入题意 【题解】 如果有环 ->直接输出-1 (拓扑排序如果存在某个点没有入过队列,说明有环->即入队的节点个数不等于n 否则。 说明可以做拓扑排序。 →是一个有向无环图。 那么定义f[x][y] 表示x节点前面的某条路径中,字母y出现的最多次数是多
阅读全文

浙公网安备 33010602011771号