DP
DP.动规
Buyi.
努力进大厂
展开
-
[2020上海ICPC] C.Sum of Log(二进制数位DP)
题目链接:http://codeforces.com/gym/102900/problem/C解题思路:①i和j不能同时为0②要是公式有意义,i和j的二进制必须每一数位都不同或者都为0③log2(i+j)+1在满足条件②的情况下表示i和j中最大的二进制数位使用数位DP对二进制进行处理,使用dp[pos][limit1][limit2]来记忆化搜索,分别表示位置、x是否达到上界、y是否达到上界有两种数位DP处理方式第一种:直接使用for循环来决定最高数位的情况#define NO_SECUR原创 2020-12-17 11:33:25 · 648 阅读 · 0 评论 -
CodeForces - 149D.Coloring Brackets(递归区间DP)
题目链接:https://vjudge.net/problem/CodeForces-149D题意:在括号匹配问题的基础上,每一对相匹配的括号对,他们之中只有一个括号可以被涂成红色或者蓝色,另一个只能涂成没有颜色。且相邻的两个括号不能是同一种颜色(不包括无颜色)解题思路:①先进行括号匹配,找出每一个位置i处括号对应的位置②dp[i][j][x][y],表示区间[i,j]且i处括号颜色为x,j处括号颜色为y的情况当处理区间[L,R]时,分两种情况进行区间DP,第一种:R和L是一对匹配的括号对,那么原创 2020-12-11 09:04:00 · 171 阅读 · 0 评论 -
*ZOJ3537.Cake(区间DP+凸包多边形判断)
题目链接:https://zoj.pintia.cn/problemsets/91827364500/problems/91827368971题意:将一个多边形分成多个三角形,求最小代价解题思路:参考首先是凸包的判断Andrew算法:struct Point{ int x,y; Point(){} Point(int xx,int yy):x(xx),y(yy){} void read(){ scanf("%d%d",&x,&y);原创 2020-12-10 12:03:52 · 113 阅读 · 0 评论 -
*CodeForces - 55D.Beautiful numbers(数位DP+离散化处理)
题目链接:https://vjudge.net/problem/CodeForces-55D题意:要求一个数可以整除它的所有的数位。求L到R范围内所有满足条件的数的个数解题思路:①一个数可以整除它的所有数位,不需要对其每个数位都去除一次,可以直接求出所有数位的公倍数,然后判断这个数能否整除它②采用数位DP,最难的是考虑如何完成记忆化搜索操作。dp[pos][num][lcm],pos为当前位置,num为当前处理的数大小,lcm为当前所有数位的公倍数。因为数据范围为9e18,所以要开ll数组,同时原创 2020-12-09 15:47:22 · 136 阅读 · 0 评论 -
*[kuangbin数位DP]HDU4507.吉哥系列故事——恨7不成妻(数位DP+推导)
题目链接:https://vjudge.net/problem/HDU-4507题意:找出一个区间内与7无关的数解题思路:先说一下我自己的错误写法:通过记录所有的数位和、对7取余后的结果以及当前的数值,当最后的情况是sum%7=0并且res%7=0时,将当前数值he的平方返回但是这样做的时候记忆化搜索的时候就会出现错误,因为不同前缀可以通过取余得到相同的sum和res,但是最后在对he进行平方相加的时候前缀不同就会影响到结果的不同,所以这种方法不可行。ll dfs(int pos, int li原创 2020-12-07 16:41:43 · 118 阅读 · 0 评论 -
[kuangbin数位DP]SPOJ - BALNUM.Balanced Numbers(数位DP+状压)
题目链接:https://vjudge.net/problem/SPOJ-BALNUM题意:要求一个数中的出现过的奇数各自出现次数为偶数次,出现过的偶数各自出现次数为奇数次解题思路:注意本题要求的情况是奇数和偶数各自出现的次数,而不是整体出现的次数,所以要进行0-9每个数字的出现次数的记录,但考虑到数位dp的记忆化搜索,没有办法保存这么,所以使用一个十位二进制保存0-9每个数出现的是奇数次还是偶数次,每次出现一个数字i就对state进行一次异或。最后数位为0,即没有出现过或者出现了偶数次,数位为1,原创 2020-12-07 16:20:26 · 104 阅读 · 0 评论 -
[kuangbin数位DP]HDU4352.XHXJ‘s LIS(数位DP+状压)
题目链接:https://vjudge.net/problem/HDU-4352题意:前面都是无关的话,只有倒数第二段与题目相关。意思就是寻找[L,R]之间数位最长上升子序列长度为K的数解题思路:数位dp+状态压缩可以用一个十位二进制数来保存最长上升子序列的情况,1的个数即最长上升子序列长度使用dp[pos][state][k]来进行记忆化搜索,pos表示位置,state表示二进制状态,k表示当前要找的长度k关于state的更新:int update(int x, int state) { f原创 2020-12-07 16:12:31 · 205 阅读 · 0 评论 -
2020CCPC长春D. Meaningless Sequence(思维+数位DP)
题目链接:http://codeforces.com/gym/102832/problem/D解题思路:可以发现一个数的大小与它的二进制表示中的1的个数有关,a=c^(二进制中1的个数)那么题目就转化为求所有数中1的个数使用的是数位dp的方法,枚举1的个数来分配。对于没有上限要求的x长度串中分配y个1的方案数直接可以使用组合数C(y,x)#include<iostream>#include<cstdio>#include<string.h>#inclu原创 2020-12-01 11:19:46 · 568 阅读 · 0 评论 -
幸运字符串(DP)
解题思路:DP主体:for (int i = 0; i <= 26; i++) dp[0][i] = 1; for (int i = 1; i <= n; i++) { //总长度为n for (int j = 1; j <= 26; j++) { //字母种数为26 for (int k = 0; k <= r && k <= i; k++) { //每个字母最多出现r次 dp[i][j] =(dp[i][j.原创 2020-11-25 09:20:11 · 506 阅读 · 0 评论 -
导弹拦截变形(去点最长上升子序列)
导弹拦截DescriptionAA 国为了防御 BB 国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。因此可能需要配备多套导弹拦截系统才能拦截所有的导弹。某天,雷达捕捉到 BB 国的导弹来袭。AA 国于是向 CC 国请求援助,CC 国可以在这些导弹进入 AA 国领空前炸掉这些导弹中的某一个。现在 AA 国想知道,对于每一个导弹,如果 CC 国把它炸掉,那么至少配备多套导弹拦截系统才能拦截剩下所有的导原创 2020-11-25 09:12:51 · 107 阅读 · 0 评论 -
2020CCPC威海L.Clock Master(质数预处理+分组背包)
题目链接:http://codeforces.com/gym/102798/problem/L题意:给一个b,要求将b分成任意n个数ti,使得(k%t1,k%t2,…,k%tn)的组合数最多。解题思路:(k%t1,k%t2,…,k%tn)的组合数可以发现是t1.t2…tn的最小公倍数,因为只有k经过最小公倍数次,才能会到最开始的(0,0,0,…,0)状态。所以这个题目就变成了求最小公倍数最大的题目。要求最小公倍数最大,那么就要求充分利用b内的数,要求拆分后的数两两互质,如果a与b不互质,那么就会浪费原创 2020-11-17 10:20:37 · 189 阅读 · 0 评论 -
**2020暑期牛客多校H.Harmony Pairs(数位DP)
题目链接:https://ac.nowcoder.com/acm/contest/5671/H题意:…解题思路:利用数位DP,dp[pos][sum][limita][limitb][limit]pos当前搜索位置 sum当前A与B数位差 limita A是否为上界情况 limitb B是否为上界情况 limit A小于或等于B因为N最大取十进制100位,所以数位差绝对值最大值小于1000,所以以base=1000为数位差起点,从最高位往后进行数位dp+记忆化注意一下dp转移和条件的原创 2020-08-03 11:39:22 · 189 阅读 · 0 评论 -
CF67A.Partial Teacher(最长不下降子段/DP)
题目链接:https://vjudge.net/problem/CodeForces-67A解题思路:第一种,寻找每个点的所在位置的峰值。向左走,遇到R,左高度+1,遇到L停止。向右走,遇到L,右高度+1,遇到R停止。最终i点峰值高度ans[i]=max(左高度,右高度)+1第二种:使用DP当s[i]为’='时,dp[i]=dp[i-1]当s[i]为’L’时,dp[i]=1,如果dp[i-1]也为1,dp[i-1]++,此时向左遍历,遇到L则dp[j]++,遇到R终止当s[i]为‘R’时,dp[原创 2020-07-30 09:11:33 · 162 阅读 · 0 评论 -
HDU6794(HDU第三场多校).Tokitsukaze and Multiple(贪心+map/dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6794题意:找到最多的不相交的子段使得子段和为p的倍数解题思路:按照序列顺序依次遍历加上各个点cur=(cur+a[i])%mod,如果cur的值在之前j点处出现过,那么说明j到i点之间的数为p的倍数两种处理方式,第一种是贪心,从前往后,遇到能够拼凑出p的倍数的情况直接拼凑,因为如果就算不在当前情况i拼凑,在后面的j进行拼凑,结果仍然是ans++,而且还会影响后面的拼凑。使用map来记录,使用map.co原创 2020-07-29 09:04:23 · 344 阅读 · 0 评论 -
最大m子段和问题+例题
#include<iostream>#include<cstdio>#include<string.h>using namespace std;#define ll long longint n,m;ll w[110000];ll dp[110000];ll ans;ll maxv;int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ scanf("%l原创 2020-07-17 11:35:43 · 557 阅读 · 0 评论 -
*ZOJ3469.Food Delivery(三维区间DP)
题目链接:https://vjudge.net/problem/ZOJ-3469题意:派送员从餐馆位置x出发,为n个人派送便当,速度是每v分钟走1个单位,每隔一分钟没有送到的人将会有b的不满意度,求最小的不满意度解题思路:可以知道每次走完一个区间,为了最优化,派送员一定是停在两端dp[i][j][0]表示配送完i到j个人之后停在最左端i位置时最小的不满意度dp[i][j][1]表示配送完i到j个人之后停在最右端i位置时最小的不满意度将店铺位置x和不满意度0放入到n个需要派送的人之中,按位置从小到原创 2020-07-16 11:05:54 · 151 阅读 · 0 评论 -
*HDU2476.String painter(区间DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2476题意:给出a和b两个字符串,目标是将a变化成b,每次变化可以将任意一段区间的字符全部涂成同一个字符,问最少的变化次数解题思路:dp[i][j]表示a串中i到j变化成b串需要的最小次数先在默认a和b串全部不相同的情况下,找出dp关系for(int k=0;k<len;k++){ for(int i=0;i+k<len;i++){ //默认直接改变 dp[i][i+k]=原创 2020-07-16 00:16:59 · 101 阅读 · 0 评论 -
HDU4283.You Are the One(区间DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4283题意:给出n个人,第k个上场的人有(K-1)*D的不满度,有一个小黑屋可以用来放人(类似于堆栈,先进小黑屋的后出)来调整上台顺序,问最小的不满度。解题思路:区间DP求出前i个值的总和 sum[i]=d1+d2+…+didp[i][j]表示第i个人到第j个人之间的最小不满意度(只考虑i到j这些人)具体解释看注释就可以for(int k=1;k<=n-1;k++){ for(int i=原创 2020-07-14 22:09:33 · 124 阅读 · 0 评论 -
POJ2955.Brackets(括号匹配问题+区间DP)
题目链接:http://poj.org/problem?id=2955题意:给出一组括号,要求从中选出一些括号组成匹配的括号对,求方案最多的匹配数的长度解题思路:区间DPdp[i][j]表示i到j之间最大的匹配数来自两个部分:①如果s[i]与s[j]组成一对括号对时,dp[i][j]=max(dp[i][j],dp[i+1][j-1]+1)②i<k<j,dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j])#include<iostream>原创 2020-07-14 21:17:02 · 214 阅读 · 0 评论 -
LightOJ - 1422.Halloween Costumes(区间dp)
题目链接:https://vjudge.net/problem/LightOJ-1422题意:给出n个聚会,每个聚会对应一套服装,每次聚会后可以在原来衣服上套上新衣服,也可以脱去衣服,每套服装在脱下后不能够再继续穿。脱衣顺序是从后穿的先脱。解题思路:dp[i][j]为从第i个晚会到第j个晚会需要的衣服数量利用区间DP转移方程为if(s[j]==s[k])dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j-1])表示将k+1到j-1之间的衣服全部脱去#inclu原创 2020-07-14 20:03:16 · 118 阅读 · 0 评论 -
*HDU1024.Max Sum Plus Plus(DP+滚动数组优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024解题思路:dp1[i]表示当前在前i个中选取j个区间的最大值dp2[i]表示在前i个中选取j-1个区间的最大值转移方程:dp1[i]=max(dp1[i-1]+s[i],dp2[i-1]+s[i]); 前部分表示s[i]直接放如前一区间中,后部分表示s[i]单独为一个区间dp2[i]=max(dp1[k]),k<i#include<iostream>#include<原创 2020-07-12 21:47:31 · 132 阅读 · 0 评论 -
*HDU1074.Doing Homework(状压DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074题意:给出n个课程,每个课程给出课程名称、截止日期、完成需要的时间,超过截止日期完成的课程每超过一天减少分数1。求最少减少的分数方案,如果有多个方案,输出字典序最小的方案解题思路:因为n最大是15,可以使用二进制来进行状压DP讨论。dp结构体:struct plan{ int pre; //记载上一个状态 int choice; //记录当前状态选择的课程 int time;原创 2020-07-12 20:20:00 · 150 阅读 · 0 评论 -
HDU1176.免费馅饼(逆向DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176解题思路:用num[i][j]记录下i点在j时间点时落下馅饼的个数dp[i][j]表示i位置处在j时间时可以获得的最大的馅饼数量采用时间倒序的方法,从最大时间开始递推到0时间点,因为0时间点一定是在中间位置6处。dp[i][j]可以由dp[i][j+1]+num[i][j],dp[i-1][j+1]+num[i][j],dp[i+1][j+1]+num[i][j]三种情况得到#include<原创 2020-07-11 21:06:56 · 150 阅读 · 0 评论 -
DP处理最长上升/下降子序列问题
1、POJ - 2533 Longest Ordered Subsequence题目链接:http://poj.org/problem?id=2533标准DP处理最长上升子序列问题#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int n;int a[1100];int dp[1100];int maxv;int main(){ cin>>原创 2020-07-11 20:39:35 · 237 阅读 · 0 评论 -
**POJ1015.Jury Compromise(01背包变形+二维背包)
题目链接:http://poj.org/problem?id=1015题意:n个评审团人数,从中选出m个人,要求这m个人的D(J)-P(J)绝对值最小,D(J)=SUM(Di),P(J)=SUM(Pi),当存在相同D(J)-P(J)时,输出D(J)+P(J)最大的情况。解题思路:因为D(J)-P(J)有正有负,所以起点从修正值20*m开始,20为D-P最大的可能值,dp[i][j]表示选择i个人,D-P值为j+20m时最大的D+P值。利用path[i][j]表示i个人,D-P值为j时候选择了的方案模原创 2020-07-10 11:51:32 · 130 阅读 · 0 评论 -
POJ1458.Common Subsequence(最大公共子序列)
题目链接:http://poj.org/problem?id=1458解题思路:dp[i][j]表示a字符串i位置与b字符串j位置时最大的公共子序列长度转移方程:for(int i=1;i<=len1;i++){ for(int j=1;j<=len2;j++){ if(s[i]==z[j]){ dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1); } else dp[i][j]=max(dp[i-1][j],dp[i][j-1原创 2020-07-10 11:14:07 · 126 阅读 · 0 评论 -
POJ1661.Help Jimmy(逆向DP)
题目链接:http://poj.org/problem?id=1661题意:老鼠从(x,y)位置处跳往地面,有n个平台,老鼠每移动到一个平台的边缘会落下,每次最大下落的高度不可以超过max(当老鼠从一个平台落到另一个平台的边缘时,可以视为落在这个平台上),老鼠每下降一个高度或者横向移动一个单位耗时1,问落到地面最短时间解题思路:先将平台按高度从大到小排序,利用逆向,从地面开始,因为这样终点都是dp[0][0]和dp[0][1],dp[i][0]表示从地面到第i个平台的左边最短时间,dp[i][1]表示从原创 2020-07-10 11:00:13 · 141 阅读 · 0 评论 -
POJ3186.Treats for the Cows(区间DP)
题目链接:http://poj.org/problem?id=3186题意:给出n个款待,每次从前端或者后端取一个款待,每个款待随着时间的进行会价值增长,第i个取出的价值为ivalue解题思路:一开始打算直接用双端队列进行,每次进行开头和结尾的比较,取出小的那一个。但这样做存在问题是如果有多个前后端价值相同的情况会无法处理,比如 100 100 1101,如果从判断条件是 d.front()<=d.back()时取前端,这样取相比d.front()<d.back()取前端获得的值更大,所以存原创 2020-07-09 23:58:18 · 118 阅读 · 0 评论 -
HDU1078.FatMouse and Cheese(dp+dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078题意:给出n和k,n*n的矩阵中每一个位置都有一些奶酪,小老鼠每次行动最多走k个方格,且每次行动都要比上一次行动时吃到的奶酪数量多,问小老鼠最多可以获得多少奶酪解题思路:dp[i][j]表示到达位置(i,j)时可以获得的最多的奶酪数,小老鼠从(0,0)位置开始,每移动到一个位置进行一次dfs,然后递归回溯#include<iostream>#include<cstdio>#原创 2020-07-09 23:30:57 · 142 阅读 · 0 评论 -
*HDU2859.Phalanx(最大对称子矩阵dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859题意:找出矩阵中最大的以右对角线为轴对称的子矩阵解题思路:dp[i][j]表示以i和j为左下角向上方和右方延伸的最长相同长度dp[i][j]由dp[i-1][j+1]决定,最大也只能比dp[i-1][j+1]大一,因为(i-1,j+1)为(i,j)的右上角,以他们为对角线组成子矩阵。如果dp[i-1][j+1]为1(即它自身),那么dp[i-1][j+1]要想找对称子矩阵也只能是1或者2。所以dp主原创 2020-07-09 23:18:07 · 152 阅读 · 0 评论 -
*POJ3616.Milking Time(dp)
题目链接:http://poj.org/problem?id=3616题意:给出n m r,m个挤奶时间段,每挤一次奶要休息r个时间点,两次挤奶的时间不可以有重叠,问n个时间点最多可以获得多少奶解题思路:预处理m个时间段,将其按照起始时间由小到大进行排序,dp[i]表示到第i个时间段(使用时间点无法进行)可以获得的最大奶量。转移方程dp[i]=max(dp[i],dp[j]+milk[i].v)转移条件:milk[j].e<=milk[i].sfor(int i=1;i<=m;i+原创 2020-07-09 23:03:51 · 154 阅读 · 0 评论 -
*POJ3666.Making the Grade(DP+离散化)
题目链接:http://poj.org/problem?id=3666题意:求将一个序列调整成纯单调(可以相等)的序列所需要的最小代价解题思路:分两种情况讨论:①不减序列:dp[i][j]表示前0~i个数的最大值为这i个数中第j大值需要改变的量因为序列a[i]的最大值可能达到1e9的大小,所以需要用用到离散化,将序列a从小到大顺序放在数组b中,j表示a序列中第j大的数值转移方程为 dp[i][j]=abs(a[i]-b[j])+min(dp[i-1][k]),1<=k<=j,对于m原创 2020-07-09 19:03:04 · 136 阅读 · 0 评论 -
*CF1216F. Wi-Fi (dp)
题目链接:https://vjudge.net/problem/CodeForces-1216F题意:给出n个房间,k表示wifi覆盖范围。然后给出一个字符串,0表示这个房间不可以装wifi,1表示这个房间可以装wifi。每个房间都可以进行装宽带,宽带费用为i,wifi费用也为i。解题思路:利用f数组保存每个点i之后最近的1的位置dp[i]表示前i个房间都被网络覆盖的最小代价遍历所有房间,每个房间的dp[i]对应有两种来源,第一种是这个房间直接装宽带dp[i]=dp[i-1]+i;第二种是找到前原创 2020-06-08 12:16:25 · 464 阅读 · 0 评论 -
POJ3040. Allowance(贪心+多情况讨论)
题目链接:http://poj.org/problem?id=3040题意:给出N种面值的钱,每一种都有各自的价值和对应的数量,问最多可以拼出多少种钱数大于等于C的方案。解题思路:按三种情况贪心处理:①把所有大于C的钱直接拿出来当做答案②从大到小找出所有能够刚好凑到C的答案③不满足上面两种情况的,先从大到小挑出不能刚好拼凑的钱,然后从小到大拼凑,当当前钱数res>C时候情况满足#include<iostream>#include<cstdio>#include&原创 2020-05-28 14:15:18 · 166 阅读 · 0 评论 -
CF484D. Kindergarten(DP+贪心)
题目链接:https://vjudge.net/contest/374302#problem/D题意:给出一串数字序列,问如何划分可以让这个序列的所有子序列中的最大值与最小值差值和最大解题思路:dp[i]表示到i点处的最大划分情况寻找极值点,a[i]>=a[i+1],a[i]>=a[i-1]或者a[i]<=a[i+1],a[i]<=a[i-1]时,超过i多取没有意义,所以寻找距离i最近的极值点作为转移条件即可,令最近的极值点为p,有两种情况,p属于前段序列中,p属于后段序列最原创 2020-05-21 11:06:33 · 182 阅读 · 0 评论 -
HDU4336. Card Collector(期望DP/容斥定理)
题目链接:https://vjudge.net/contest/373128#problem/H题意:收集卡片,给出每一张卡片的抽取概率,问预期抽多少次才能够全部收集完解题思路:第一种:利用期望DP先说一下期望的递推公式i/n为抽到已经有的情况的概率f[i]为当前状态,f[i+1]为下一个状态,1为代价值(无论能否成功转移都要1次机会)。转化可以得到本题的递推公式是这样:f[i]=∑p[ i→j ]f[ j ]+∑(1-p[ i→j ])f[ i ]+w[ i→j ]利用二进制表示所有原创 2020-05-18 17:28:12 · 233 阅读 · 0 评论 -
CF730J.Bottles(有限制条件的0/1背包)
题目链接:https://vjudge.net/contest/373875#problem/J题意:给n个瓶子,每个瓶子放了一些水,现在要把这些水尽可能汇总到最少的瓶子了,问最少的瓶子数与移到这些瓶子里所要的最小代价解题思路:最少瓶子数很好求,直接先把水的总量rsum求出来,然后从大的容量的瓶子开始放,就能得到最少瓶子数k求最小的代价,就相当于从总的瓶子里面找出k个能放入rsum水的瓶子,并且这些瓶子中本来的水的量最多利用0/1背包,dp[i][j]表示容量为i、选取了j个物品的最大价值将n个原创 2020-05-17 15:09:35 · 400 阅读 · 0 评论 -
CF1312E. Array Shrinking(线性DP)
题目链接:https://vjudge.net/contest/373875#problem/I题意:相邻两个一样的数a可以合并成为一个a+1,问合并后的最短长度解题思路:dp[i][j][0]表示i到j是否被合并dp[i][j][1]表示i到j合并后的值dp主体部分:void DP(){ for(int k=1;k<=n-1;k++){ for(int i=1;i+k<=n;i++){ for(int j=i;j<=i+k-1;j++){ if(dp[i]原创 2020-05-17 14:54:49 · 965 阅读 · 0 评论 -
POJ2342.Anniversary party(树状DP)
题目链接:https://vjudge.net/contest/373128#problem/D题意:周年纪念日聚会,n个人组成以校长为首的一颗树,每个人都有对应的欢乐度和与其他的上下级关系,在任意两个人没有直接上下级关系的情况下,求最大的欢乐度解题思路:利用vector数组son和数组father来保存上下级关系dp[i][0]表示第i个人不来的最大欢乐度情况dp[i][1]表示第i个人来的最大欢乐度情况dp[i][0]+=max(dp[son][1],dp[son][0]),当第i个人不来的原创 2020-05-14 16:51:47 · 99 阅读 · 0 评论 -
CF461B.Appleman and Tree(树状DP)
题目链接:https://vjudge.net/contest/373128#problem/A题意:给出一颗树有n个结点,每个结点有黑白颜色之分,给出n-1条边,问有多少种方案可以把树分成多个有且只有一个黑色结点的子树。解题思路:dp[i][1]表示以i为根的只有一个黑色结点的子树方案个数dp[i][0]表示以i为根的没有黑色结点的子树方案个数令to为与i相连的结点,则dp[i][1]=dp[i][0]dp[to][1]+dp[i][1](dp[to][0]+dp[to][1]);dp[i]原创 2020-05-14 16:40:16 · 141 阅读 · 0 评论