随笔分类 -  DP

摘要:题面 这道题是一道隐藏的比较深的DP(我太蒟蒻了!) 设f[i][j]表示到第i列时高度为j的最少步数是多少; 求上升时的方案就是一个完全背包!,求下降时的方案就是一个01背包; 然后处理边界就能A掉; 阅读全文
posted @ 2019-08-30 11:33 神之右大臣 阅读(232) 评论(0) 推荐(0)
摘要:题面 一道思维难度不大的状态压缩,也并不卡常,但细节处理要格外注意; f[i][j]表示前i行最后一行状态是j的方案数 阅读全文
posted @ 2019-08-26 15:48 神之右大臣 阅读(196) 评论(0) 推荐(0)
摘要:题面 一个树形DP, f[i]=表示以i为根可以得到的子树个数; 则f[i]*=(f[j]+1); 初始化f[i]=1; ans=sigma(f[i]); 阅读全文
posted @ 2019-08-26 14:00 神之右大臣 阅读(175) 评论(0) 推荐(0)
摘要:题面 状态可能不太好想,设f[i][j][k]表示前i行其中有j行是放一个炮,有k行是放两个炮的合法方案数; 那么: f[i+1][j][k]+=f[i][j][k] 在这一行不放任何棋子; f[i+1][j+1][k]+=f[i][j][k]*(m-k-j); 在剩余的m-k-j个空行中随机选择一 阅读全文
posted @ 2019-08-22 20:45 神之右大臣 阅读(234) 评论(0) 推荐(0)
摘要:题面 这道题我觉得是个不错的题; 根据题意可以较清晰的发现ans只和n和k有关;(因为输入的只有这两个数啊~); 那么设f[i][j]表示前i层用了j个节点的方案数,g[i][j]表示深度小于等于i并且用了j个节点的方案数总和; 对于一颗树,可以把它分成3部分:根节点,左字树,右子树; 对于一颗深度 阅读全文
posted @ 2019-08-22 19:58 神之右大臣 阅读(209) 评论(0) 推荐(0)
摘要:题面 设f[i][j][k][l]为从小渊传到小轩的纸条到达(i,j),从小轩传给小渊的纸条到达(k,l)的路径上取得的最大的好心程度和。 f[i][j][k][l]=max( f[i][j-1][k-1][l] , f[i-1][j][k][l-1] , f[i][j-1][k][l-1] , f 阅读全文
posted @ 2019-08-22 18:53 神之右大臣 阅读(272) 评论(0) 推荐(0)
摘要:题面 对于m==1和m==2两种状态进行不同的dp; 设sum[i][1]表示第一列的前缀和,sum[i][2]表示第二列的前缀和; sum[i][1]=sum[i-1][1]+a[i][1]; sum[i][2]=sum[i-1][2]+a[i][2]; 当m=1时, 设f[i][j]表示前i个数 阅读全文
posted @ 2019-08-22 17:21 神之右大臣 阅读(241) 评论(0) 推荐(0)
摘要:题面 大家都是两遍SPFA吗?我这里就一遍dp啊; 首先判断对于一个点u,是否可以从一号点走到这里,并且可以从u走到n号点; 对于这样的点我们打上标记; 那么抛出水晶球的点一定是从打上标记的点中选出一个;(自己可以理解一下) 然后跑一遍dp,dp[i]表示从点1到点i的若干条路径中,所经过的点的权值 阅读全文
posted @ 2019-08-21 15:58 神之右大臣 阅读(164) 评论(0) 推荐(0)
摘要:题面 按照常见树形背包定义状态:设dp[u][j]表示在以u为根的子树中,选择j个客户所能获得的最大收益。 状态转移:dp[u][j]=max(dp[u][j-k],dp[v][k]-w(u,v)); 注意因为二维的是滚动数组,所以应该倒着循环。 阅读全文
posted @ 2019-08-14 13:37 神之右大臣 阅读(369) 评论(0) 推荐(0)
摘要:题面 对于“n个物品选任意个”我们就可以想到一种递推方法,即设f[i][j]表示前i个物品选j个的最大收益 我们发现正着转移并不好转移,我们可以倒着转移,使选择的当前第i号物品为第一个物品,这样的话我们就发现这个物品对答案做的贡献就变成了a[i].w−a[i].r∗(j−1),于是写出转移方程: f 阅读全文
posted @ 2019-08-14 12:03 神之右大臣 阅读(153) 评论(0) 推荐(0)
摘要:题面 这道题好狗的说,数组开大一点会MLE掉,开少一点会RE掉~; 下面是正解: 我们设计状态:f[i][j][k][now]四维DP 第一维和第二维(i,j)表示处于矩阵的(i,j)处(最后的结尾是(i,j)); 第三维k表示小A瓶中的值-小uim瓶中的值。(可以利用神奇的取模运算来使其是正数); 阅读全文
posted @ 2019-08-13 15:09 神之右大臣 阅读(139) 评论(0) 推荐(0)
摘要:题面 很简单的一个二维DP f[i][j]表示最后吃到(i,j)所能获得的最大值, 那么f[i][j]=max(f[i+1][j-1],f[i+1][j],f[i+1][j+1])+a[i][j]; 注意f要初始化为负无穷大; 阅读全文
posted @ 2019-08-13 14:16 神之右大臣 阅读(154) 评论(0) 推荐(0)
摘要:题面 这道题的数据范围一看就是dfs或状压啦~ 本文以状压的方式来讲解 f[i][j]表示目前的节点是i,已经经历过的节点的状态为j的简单环的个数; 具体的转移方程和细节请看代码; PS:(i&-i)的意义便是树状数组 阅读全文
posted @ 2019-08-01 08:56 神之右大臣 阅读(164) 评论(0) 推荐(0)