摘要: 原题 题目链接 题目分析 由题目知,如果能求出连接点的最长递增子序列,则可以把连接不在该序列中的点的线全部剪掉.而维护最长递增子序列可以用dp来做,考虑到相同长度的递增子序列末尾数字越小越好,可以这样定义dp,dp[i]长度为i的递增子序列的最小末尾值,初始化为INF,由于这个dp具有有序性,因此可 阅读全文
posted @ 2019-08-25 19:09 VBL 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 原题 题目链接 题目分析 题意很明确,就是要维护单调递增的序列,最后看有多少种单调序列即可,设定一个dp数组,cnt表示数组大小,初始化为0,然后把所有木头从小到大排个序,当遍历到木头i时,如果dp数组里有比木头i还小的,就代替它,否则就dp[cnt++]=木头i,最后cnt就是答案. 代码 阅读全文
posted @ 2019-08-25 16:36 VBL 阅读(107) 评论(0) 推荐(0) 编辑
摘要: 原题 题目链接 题目分析 完全背包题,不过需要状压和处理大数,首先定义dp[i][j]为用前i种货币(从1-k),凑出j价格的方案数,dp初始化为0,然后更新有两个方向,第一种显然dp[i][j]+=dp[i-1][j],第二种dp[i][j]+=dp[i-1][j-i]+dp[i-1][j-2i] 阅读全文
posted @ 2019-08-25 14:25 VBL 阅读(107) 评论(0) 推荐(0) 编辑
摘要: 原题 题目链接 题目分析 计数dp题,感觉其实也可以用组合数学做,但我太菜了,推不出通用公式.dp可以定义dp[i][j]为前i种选j个蚂蚁有多少种选法,然后递推公式如下,其中c[i]表示第i种的数量, dp[i][j]=Σ(min(j,c[i]),k=0)dp[i-1][j-k].可以化简一下,d 阅读全文
posted @ 2019-08-25 10:41 VBL 阅读(132) 评论(0) 推荐(0) 编辑