摘要: 链接:Miku 这道题的dp还是先更新子节点,在更新父节点,不过问题就是怎样更新他们 我们定义ff[i][j]为第i个节点字数上共保留j条边的情况下最多的苹果数,对于每一个点,他保留的边必然是他直接保留的之前保留的边和他当前儿子保留的边的值的和加上这一条边的 边权,即ff[u][i]=max(ff[ 阅读全文
posted @ 2020-01-20 22:18 Simex 阅读(142) 评论(0) 推荐(0) 编辑
摘要: 链接:Miku 此文不是正解,而且主要内容都在代码和注释上 这是暴力分组背包做法 对于每一个主件及其附件,我们的选择是有限的,而且这道题中说了最多两个附件,那么 我们完全可以枚举每一种组合,然后组合成一件新的物品,并且属于同一个集合,然后对处理后的新物品们 跑分组背包就行了 #include<ios 阅读全文
posted @ 2020-01-20 21:59 Simex 阅读(109) 评论(0) 推荐(0) 编辑
摘要: 链接:Miku 分组背包,我们只需要在01背包的基础上稍加修改,把同一类的物品同时枚举即可。 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,m; 阅读全文
posted @ 2020-01-20 21:41 Simex 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 链接:Miku 很入门的树形dp,首先,在这个题中,我们要做的就是求出来每一个子节点,然后用他们去更新父亲节点。 对于每一个节点,他有两种状态,去,或者不去,我们定义dp[i][0]为第i个节点也去的状态,而dp[i][1]为它不去,那么很显然 如果这个点去了,它的子节点肯定不去,那么dp[i][1 阅读全文
posted @ 2020-01-20 21:34 Simex 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 链接:Miku 这是一道dp题,我么很容易发现这点。 数据范围很大,如果直接用两个塔的高度当状态,很危险,我们就必须要考虑一下优化了。 两个塔的高度其实是没有没要的,我们追求的是差值,那么,比如6 8 和7 9,很明显,无论我们怎么放,第二个就是第一个加1,无论如何。 那么我们没必要存第一个状态的, 阅读全文
posted @ 2020-01-20 12:44 Simex 阅读(140) 评论(0) 推荐(0) 编辑