[USACO 2017 Dec Gold] Tutorial
Posted newera
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[USACO 2017 Dec Gold] Tutorial相关的知识,希望对你有一定的参考价值。
Link:
A:
B:
将无根树转化为有根树方便计数
明显树形$dp$,转移$dp[i][j]=prod_{kin son} dp[k][(j+1)mod3]+dp[k][(j+2)mod3]$
#include <bits/stdc++.h> using namespace std; #define X first #define Y second typedef long long ll; typedef pair<int,int> P; const int MAXN=1e5+10,MOD=1e9+7; struct edge{int nxt,to;}e[MAXN<<2]; int n,k,x,y,head[MAXN],tot;ll dp[MAXN][3]; void add_edge(int x,int y) {e[++tot].nxt=head[x];e[tot].to=y;head[x]=tot;} void dfs(int x,int anc) { for(int i=head[x];i;i=e[i].nxt) { if(e[i].to==anc) continue; dfs(e[i].to,x); for(int j=0;j<3;j++) (dp[x][j]*=dp[e[i].to][(j+1)%3]+dp[e[i].to][(j+2)%3])%=MOD; } } int main() { scanf("%d%d",&n,&k); for(int i=1;i<n;i++) scanf("%d%d",&x,&y),add_edge(x,y),add_edge(y,x); for(int i=1;i<=n;i++) dp[i][0]=dp[i][1]=dp[i][2]=1; for(int i=1;i<=k;i++) scanf("%d%d",&x,&y),y--,dp[x][(y+1)%3]=dp[x][(y+2)%3]=0; dfs(1,0); printf("%lld",(dp[1][0]+dp[1][1]+dp[1][2])%MOD); return 0; }
C:
以上是关于[USACO 2017 Dec Gold] Tutorial的主要内容,如果未能解决你的问题,请参考以下文章
[USACO 13DEC]Vacation Planning(gold)
[USACO 2016 Dec Gold] Tutorial
贪心 洛谷P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold