https://arc101.contest.atcoder.jp/tasks/arc101_c

题解是也是dp,好像是容斥做的,但是看不懂,而且也好像没讲怎么变n^2,看了写大佬的代码,自己理解了一下

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
#define X           first
#define Y           second
#define pb          push_back
#define mp          make_pair
#define SZ(X)       (X.size())
#define mst(a,b)    memset((a),(b),sizeof(a))
#define lowbit(a)   ((a)&(-a))
using namespace std;
typedef unsigned long long ull;
typedef long long LL;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<LL, LL> pll;
const int mod=1e9+7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int maxn=5500;
inline int add(int x,int y){if((x+=y)>=mod)x-=mod;return x;
}
inline int mul(int x,int y){return (ll)x*y%mod;
}
inline int sub(int x,int y){if((x-=y)<0)x+=mod;return x;
}
int ci[maxn];
vector<int>to[maxn];
int dp[maxn][maxn];//dp[pos][i] 子树,有i个点未匹配的合法方案//除了根之外的子树自匹配完是不合法的,所以-dp[pos][0]表示以pos为根的子树匹配完,但pos之下子树各自之间未匹配完
int sz[maxn],uu[maxn];
void dfs(int pos,int fa){sz[pos]=1;dp[pos][1]=1;for(int d:to[pos])if(d!=fa){dfs(d,pos);for(int i=0;i<=sz[pos]+sz[d];++i)uu[i]=0;for(int i=0;i<=sz[pos];++i)for(int j=0;j<=sz[d];++j)uu[i+j]=add(uu[i+j],mul(dp[pos][i],dp[d][j]));sz[pos]+=sz[d];for(int i=0;i<=sz[pos];++i)dp[pos][i]=uu[i];}for(int i=2;i<=sz[pos];i+=2)dp[pos][0]=sub(dp[pos][0],mul(dp[pos][i],ci[i]));
}
int main() {
#ifdef localfreopen("in.txt", "r", stdin);
#endif // localios::sync_with_stdio(0);cin.tie(0);cout.tie(0);ci[0]=1;for(int i=2;i<maxn;i+=2)ci[i]=mul(ci[i-2],i-1);int n;cin>>n;for(int i=1;i<n;++i){int a,b;cin>>a>>b;to[a].push_back(b);to[b].push_back(a);}dfs(1,0);cout<<(mod-dp[1][0]);return 0;
}

转载于:https://www.cnblogs.com/bibibi/p/9542644.html

Atcoder ARC101 E 树dp相关推荐

  1. [BZOJ2125]最短路(圆方树DP)

    题意:仙人掌图最短路. 算法:圆方树DP,$O(n\log n+Q\log n)$ 首先建出仙人掌圆方树(与点双圆方树的区别在于直接连割边,也就是存在圆圆边),然后考虑点u-v的最短路径,显然就是:在 ...

  2. 【BZOJ1040】【codevs1423】骑士,第一次的基环外向树DP

    传送门1 传送门2 思路: 好题 比较简单的DP思路 之前没写过基环树DP,第一次搞真心orz 我们发现这些元素是具有从属关系的 也就是说如果对"厌恶的骑士"两两相互连边,那么问题 ...

  3. 51nod1812树的双直径(换根树DP)

    传送门:http://www.51nod.com/Challenge/Problem.html#!#problemId=1812 题解:头一次写换根树DP. 求两条不相交的直径乘积最大,所以可以这样考 ...

  4. 基环树DP(bzoj 1040: [ZJOI2008]骑士)

    树:n个点n-1条边的连通图 基环树:n个点n条边的连通图,也就是一个环套着多棵树 基环树DP:找到环上任意相邻两点,断掉这两点之间的边,就形成了一棵树 之后对这两点分别进行一次树形DP即可 例题: ...

  5. P1295 [TJOI2011]书架(线段树dp)

    P1295 [TJOI2011]书架(线段树dp) 我好菜 先考虑普通dp: d p i = m i n ( d p j + m a x ( h j + 1 , h j + 2 - , h i ) ) ...

  6. 【BZOJ1124】Mafia(POI2008)-环套树DP

    测试地址:Mafia 做法: 本题需要用到环套树DP. 按照题目构图,很显然是我们很熟悉的环套树森林.接下来我们进行分析,最后活下来一些什么人是合法的呢?观察发现,一个人的目标如果是自己那就必死,而没 ...

  7. 洛谷P2495 [SDOI2011]消耗战(虚树dp)

    P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...

  8. 【暖*墟】#动态规划# 基环树DP的学习与练习

    因为弃置了 四边形不等式优化 ,所以DP的任务还剩下 基环树DP / 插头DP / 动态DP 当然,树形DP / 状压DP / 数位DP / 斜率优化DP 也还是要练习的...... 一 . 基环树的 ...

  9. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

最新文章

  1. 阿里员工绩效只拿3.25!自我反省:平时假装努力!晚上没加班!去厕所时间太长!还老买彩票!...
  2. 全民自动驾驶5年内真的会来吗?这是Lyft的自动驾驶2.0
  3. 通过数据库绑定的dropdownlist,如何让其第一条默认显示--请选择--
  4. html5怎么实现自动缩放图片,如图,html5开发的手机端web在线客服聊天,如何实现图片点击放大,捏合缩放功能?...
  5. 如何使用pFuzz以多种方法验证Web应用程序防火墙的安全性
  6. spring 控制hibernate的session何时关闭.
  7. 启动activity的标准的action常量及对应的字符串
  8. javascript中的命名规则和方法
  9. android开机自动开启zram,低内存配置  |  Android 开源项目  |  Android Open Source Project...
  10. python3.4.3如何获取文件的路径
  11. Cast-128 加密算法和 MyPassWord 的破解
  12. ArcGIS的 高斯-克吕格 投影坐标系
  13. PV,UV,IP,VV,CV的含义与区别
  14. 这个对老爸老妈有好处
  15. cesium 直接加载 geotiff 影像图
  16. 推荐适合胖mm大码 连衣裙 显瘦女装穿搭
  17. 俄罗斯方块练习中对 swift 语言的体会
  18. MATLAB中 分数化简
  19. 服务客户的重要原则:“悦近来远”
  20. 视觉里程计4(SLAM十四讲ch7)-ICP

热门文章

  1. 【链表】Add Two Numbers
  2. DB天气app冲刺二阶段第七天
  3. poj 2886Who Gets the Most Candies?
  4. mysql全文索引中文问题的解决(转)
  5. 版本低于1.7的jQuery过滤用户输入数据所使用的正则表达式存在缺陷
  6. python中文字符串转list
  7. 说说 C 语言中的变量与算术表达式
  8. 获取电脑和操作系统信息-uname
  9. 卡拉丁发布第四代车用空调滤清器
  10. 给大家推荐一款高大上的代码高亮插件(sublime,github风格)——highlight.js