动态规划
# 动态规划
快乐撸代码
一个今天胜过两个明天
展开
-
状压dp Poj - 3254 Corn Fields
状压dp题意有一块 m 行 n 列的农场地形,要在 ‘1’ 上养牛,并且相邻上下左右不能同时养牛。问:有多少种方案来养牛?思路先看第一行样例 1 1 1,肯定不能相邻养牛,所以有以下几种情况0 0 000 0 110 1 021 0 041 0 15当加上第二行的时候,又分为两种情况,每种情况与上一行结合判断是否可行得出状态转移方程:dp [ i ] [ state[ j ] ] = dp [ i - 1 ] [ state [ k1 ] ]原创 2020-05-23 10:37:00 · 211 阅读 · 0 评论 -
Codeforces 461B ——树形dp
@树形dp题号:Codeforces 461B题意:输入 n ,表示有一个 n 个节点的树;输入 n-1 个数 P[0] ~ P[n-1],p[i]表示无向边将 i+1 和 P[i] 连接起来输入 n 个数 ,表示每个节点的颜色,0为白色,1为黑色要切断 k 条边变成 k 个连通分量,每个分量有且只有一个方案数,求有多少种分割方案;思路:从根节点向下递归,上层利用回溯计算结果;实在搞不懂,先记录一下撸代码:#include<stdio.h>#include<str原创 2020-05-08 21:12:32 · 212 阅读 · 0 评论 -
poj - 2096 概率dp (找bug)
题意:一个人一天只能找1个bug ,这个bug属于s个子系统中的某一个子系统,属于n种bug 中的某一种,求 这个人找出n种bug ,并且s个系统都bug的期望 (每个系统的一定可以找出bug)一直在纠结 dp[i][j]是不是自己的子期望 ,先这么想吧:dp[i][j] 的子期望是四种状态 ,所以在这里面 ,dp[i][j]状态转移方程可以这么写 ,但是要从它表示的意义去理解撸代码:...原创 2020-03-26 19:34:43 · 153 阅读 · 0 评论 -
HDU - 3555 数位dp
题意:t 组样例 ,每组一个 n ,判断n以为含有49的数有多少个#include<stdio.h>#include<algorithm>#include<iostream>using namespace std;typedef long long LL;LL dp[25][3];void init(){ dp[0][0]=1;//长...原创 2020-03-17 20:19:54 · 135 阅读 · 0 评论 -
区间dp暂时的理解
因为刚刚看了区间dp,所以写一下对区间dp的理解。例题:石子归并51Nod - 1021 看了一篇博客,觉得他说得比较容易理解,所以再次重复一遍:假如你是上帝,已经知道了1~n堆石子的最优解,那么它肯定是由两个子堆组成的,同理,两个子堆也分别都有自己的两个子堆,到最底层肯定是1~n堆石子的自身,那我们回到最初,1~n堆石子肯定有一个分割点,dp[ i ][ j ]代...原创 2019-12-17 19:30:02 · 135 阅读 · 0 评论 -
(连续的矩形)HDU - 1506
题意:7 2 1 4 5 1 3 3 直接讲数据 :给出7个矩形的高,底长都为1,求最大的连通的矩形块的面积思路:如果暴力的话肯定超时,有一个特别巧妙的预处理,如果我们知道每一个矩形的左右两边能延伸到哪就好了,这相当于一个并查集:如果我找到了 i ,并且小于等于第 i-1 的高度,那 i-1 的左边界就赋给 i ,向递归一样找下去,直到最左边或者 i 的高度小于左边界的左边。右边界也是这样。...原创 2019-07-28 17:32:13 · 147 阅读 · 0 评论 -
HDU - 1160 最长上升子序列以及记录路径
题意:第一列,给出老鼠的重量,第二列,给出老鼠的速度,要证明老鼠的重量越大,速度越小,给出最多老鼠的数量,并说明第几只。思路:先将老鼠按照重量从大到小排序,然后速度是从小到大,求最长上升子序列,学习下怎么输出最长上升子序列的路径,输出最长上升子序列路径有很多种方法,这里面是记录每个数字在最长上升子序列中的下标。因为在维护最长上升子序列数组的时候,我们会遍历到每一个元素。代码里面有样例;/...原创 2019-07-28 17:48:54 · 635 阅读 · 0 评论 -
HDU - 1503 最长公共子序列记录路径
题意:先给两个水果的名字然后得出一个最短的序列包含这两个词。思路:我一开始的思路是先求出最长公共子序列,然后做一些处理将其他的部分输出来:两种水果的字符串和最长公共子序列的字符串这三个字符串做对比,当他们三个相同的时候将最长公共子序列里面的字符去掉,如果不相同,将水果中的字符串中的字符去掉直到相同为止,不过网上用了一个好像比较方便的方法,在输出最长公共子序列的路径时候也能输出其他的字符(利用递...原创 2019-07-28 18:02:54 · 336 阅读 · 0 评论 -
POJ - 1276 二进制优化多重背包为01背包
题意:直接说数据,735是目标值,然后3是后面有三种钱币,四张125的,六张五块的和三张350的。思路:能够轻易的看出这是一个多重背包问题,735是背包的容量,那些钱币是物品,而且有一定的数量,是多种背包。但是做的时候总是超时。可能是因为m和n太大。然后可以通过二进制把它转化为01背包,因为将钱币的数量化为二进制,1 2 4直到数量减一。化成的二进制数字排列组合,可以组成任意钱币数量...原创 2019-07-28 18:25:53 · 157 阅读 · 0 评论 -
CodeForces - 1249E 楼梯和电梯
题意:第一行输入n和c,表示有n层楼,电梯来到需要时间c输入两行数,每行n-1个,表示从一楼到二楼,二楼到三楼.....n-1楼到n楼,a[ ] 走楼梯和 b[ ] 乘电梯花费的时间思路:动态规划,考虑几种状态,假设当前在i-1层,想要去i层,有两种方法,乘电梯,走楼梯。i-1层要考虑由什么状态到i-1层的,电梯和楼梯,如果是电梯,走楼梯或者乘电梯直接加上需要的时间即可,如果是楼梯状态...原创 2019-10-31 19:57:06 · 255 阅读 · 0 评论