HDU4340 Capturing a country 树形dp

坑死了,计算明明会出现小数,然而题目什么都没说,看标程才知道要舍去,然而舍去的时机又得猜。

记dp[i][j][k]为状态表。其中i表示节点编号,j表示军队编号,k表示当前状态的子树是否保证每个相同军队形成的连通域都有一个全消耗的节点。

转移方程在代码中

#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<sstream>
#include<stack>
#include<queue>
#include<fstream>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<functional>
#include<cmath>
#define CLR(x) memset(x,0,sizeof(x))
#define SETMAX(x) memset(x,0x3f,sizeof(x))
#define SETNO(x) memset(x,-1,sizeof(x))
#define ll long long
#define eps 3e-12
#define pow2(x) ((x)*(x))
#define forto(i,n) for(int i=0;i<n;i++)
#define for1to(i,n) for(int i=1;i<=n;i++)
#define VI vector<int>
const double PI=acos(-1.0);
#define INF 0x3f3f3f3f
#define NINF 0xbfffffff
using namespace std;
int A[2][111];
int p[111];
int to[222];
int bro[222];
int tot;
void AddEdge(int u,int v)
{
    to[++tot]=v;
    bro[tot]=p[u];
    p[u]=tot;
}

int dp[111][2][2];
bool visited[111];
void dfs(int pt)
{
    visited[pt]=true;
    dp[pt][0][0]=A[0][pt]/2;
    dp[pt][1][0]=A[1][pt]/2;
    dp[pt][0][1]=A[0][pt];
    dp[pt][1][1]=A[1][pt];
    for(int e=p[pt];e;e=bro[e])
    {
        int tar=to[e];
        if (visited[tar])
            continue;
        dfs(tar);
        for(int i=0;i<2;i++)
        {
            dp[pt][i][1]=min(
                            dp[pt][i][0]+dp[tar][i][1],min(
                            dp[pt][i][1]+dp[tar][i][0],
                            dp[pt][i][1]+dp[tar][i^1][1])
                            );
            dp[pt][i][0]+=min(dp[tar][i^1][1],dp[tar][i][0]);
        }
    }
}

int main()
{
    int n;
    while (scanf("%d",&n)!=EOF)
    {
        CLR(p);
        CLR(visited);
        tot=0;
        for(int K=0;K<2;K++)
            for1to(i,n)
                scanf("%d",&A[K][i]);
        forto(i,n-1)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            AddEdge(u,v);
            AddEdge(v,u);
        }
        dfs(1);
        printf("%d\n",min(dp[1][0][1],dp[1][1][1]));
    }
    return 0;
}

你可能感兴趣的:(HDU4340 Capturing a country 树形dp)