
vijos
文章平均质量分 65
无敌大饺子
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
vijos P1180 选课
题目地址:P1180 选课 多叉的情况不好做,所以可以转换成二叉树. 那么设dp[i][j]为以i为根节点的子树上选择j门课. dp[i][j] = max(dp[right][j], dp[left][k - 1] +dp[right][j - k] + credit[i] | 1 因为转换成了二叉树,所以任何节点i的右节点是其多叉树上的兄弟节点,左节点才是多叉树的子树. 所以dp[r原创 2014-03-29 21:07:33 · 1192 阅读 · 0 评论 -
vijos 1218 数字游戏(环形dp)
第一次接触环形的dp,学到了一招:把环复制一次就变成了线了,不过复杂度同样也要上一层. 枚举每一个切割点k,对[k, k + n]序列做如下dp: 设dp[i][j]为前i个数字分成j堆能得到最大/最小值. 则dp[i][j] = max/min{dp[p][j - 1] * (sum(p + 1, i) % 10) | 1 base case:dp[i][1] = sum(1, i)原创 2014-03-22 20:07:47 · 1286 阅读 · 0 评论 -
vijos 1038 添加括号
石子合并类似的问题,要求找出括号的添加方法,最小中间和之和,各个中间和. 设dp[i][j]为i到j之间最小中间和之和 则dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[i][j] | i base case:dp[i][i] = 0 #include #include #include using namespace s原创 2014-03-23 21:32:23 · 965 阅读 · 0 评论 -
vijos 1071 新年趣事之打牌
01背包问题,要求能否填满整个背包,由于要求出那几张牌丢失,所以不能使用滚动数组.. 这种情况下把dp[0][0]置0,其他的置为无穷小,再进行普通的01背包. 如果dp[N][TotalW] != TotalW那么说明没有解. 再判断是否dp[i][TotalW- W[i]] + W[i] == TotalW,如果是那么就可以通过第i张牌和前面i - 1张牌中的某几张牌组成totalW,如原创 2014-03-25 18:19:36 · 779 阅读 · 0 评论 -
vijos 1121马拦过河卒
设dp[i][j]为从[0,0]到[i,j]的方案数,那么dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 这里i - 1 和j - 1必须在边界里并且[i - 1, j]和[i, j - 1]必须不能被马控制. 用的是记忆化搜索. #include #include using namespace std; const int MAX = 20; bool r原创 2014-03-25 14:31:24 · 594 阅读 · 0 评论