POJ 1463 Strategic game

POJ 1463 Strategic game

/**
樹狀dp
POJ 1463 Strategic game
*/
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define ll long long
#define maxn 1505
using namespace std;
vector <int> v[maxn];
int dp[maxn][2]; 
/**
dp[i][0]表示以i爲根節點的子樹,在i處不放士兵的最小士兵書
dp[i][0]初始爲0
dp[i][0]+=dp[i_son][1];
dp[i][1]表示以i爲根節點的子樹,在i處放士兵的最小士兵書
dp[i][1]初始爲1
dp[i][1]+=min(dp[i_son][0],dp[i-son][1]);
*/
int dfs(int root){
    if(v[root].empty()) {
        dp[root][1]=1; //葉子節點放士兵爲1
        dp[root][0]=0; //不放士兵爲0
        return 1;
    }
    for(int i=0;i<v[root].size();i++){
        int son=v[root][i];
        dfs(son);
        dp[root][1]+=min(dp[son][0],dp[son][1]);
        dp[root][0]+=dp[son][1];
    }
    dp[root][1]+=1;
    return min(dp[root][0],dp[root][1]);
}
int main(){
    int n;
    while(~scanf("%d",&n)){
        int root,m,a;
        memset(v,0,sizeof(v));
        memset(dp,0,sizeof(dp));
        int r;
        for(int i=0;i<n;i++){
            scanf("%d:(%d)",&root,&m);
            if(i==0) r=root;
            for(int j=0;j<m;j++){
                scanf("%d",&a);
                v[root].push_back(a);
            }
        }
        int ans=dfs(r);
        printf("%d\n",ans);
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章