摘要:
原题 题目链接 题目分析 由题目知,如果能求出连接点的最长递增子序列,则可以把连接不在该序列中的点的线全部剪掉.而维护最长递增子序列可以用dp来做,考虑到相同长度的递增子序列末尾数字越小越好,可以这样定义dp,dp[i]长度为i的递增子序列的最小末尾值,初始化为INF,由于这个dp具有有序性,因此可 阅读全文
摘要:
原题 题目链接 题目分析 题意很明确,就是要维护单调递增的序列,最后看有多少种单调序列即可,设定一个dp数组,cnt表示数组大小,初始化为0,然后把所有木头从小到大排个序,当遍历到木头i时,如果dp数组里有比木头i还小的,就代替它,否则就dp[cnt++]=木头i,最后cnt就是答案. 代码 阅读全文
摘要:
原题 题目链接 题目分析 完全背包题,不过需要状压和处理大数,首先定义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] 阅读全文
摘要:
原题 题目链接 题目分析 计数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 阅读全文