Codeforces Round #263 (Div. 1) B. Appleman and Tree

树形DP

dp[ u ][ 1 ] 表示u节点在某个黑色点集中的方案数

dp[ u ][ 0 ] 表示u节点在某个白色点集中的方案数

因为如何切边和父亲没有关系,所以只需要dfs,从底层更新至上

方案数就是按照组合的乘法规则直接乘起来就行了(详见代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define CLR(x,y) memset(x,y,sizeof(x))
#define mp(x,y) make_pair(x,y)
#define eps 1e-9
#define INF 0x3f3f3f3f

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair pll;
typedef complex point;
typedef pair pii;
typedef pair piii;

template
inline bool read(T &n)
{
    T x = 0, tmp = 1; char c = getchar();
    while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
    if(c == EOF) return false;
    if(c == '-') c = getchar(), tmp = -1;
    while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
    n = x*tmp;
    return true;
}
template 
inline void write(T n)
{
    if(n < 0)
    {
        putchar('-');
        n = -n;
    }
    int len = 0,data[20];
    while(n)
    {
        data[len++] = n%10;
        n /= 10;
    }
    if(!len) data[len++] = 0;
    while(len--) putchar(data[len]+48);
}
//-----------------------------------

const int MOD=1000000007;
const int MAXN=100010;
vector g[MAXN];
int color[MAXN],pre[MAXN];
ll dp[MAXN][2];
int n;

void dfs(int x)
{
    int len=g[x].size();
    dp[x][color[x]]=1;dp[x][color[x]^1]=0;
    for(int i=0;i


你可能感兴趣的:(动态规划,&,贪心)