hdu 1011 Starship Troopers 樹形dp

hdu 1011 Starship Troopers

http://acm.hdu.edu.cn/showproblem.php?pid=1011

題意: 一個洞穴有很多房間,每個房間有一些bug和brain,擁有一些Troopers可以消滅bug,一個Troopers可以消滅20個bug,Troopers已走過 的房間不可以再回去,同時留下消滅bug的Troopers不可以再去其他房間消滅bug,問最多可以得到多少brain

 

注意幾點:

1 建圖時建無向圖,題中給定的點不一定先給的就是父節點,所以用一個vis記錄是否走過

2 即使bug數爲0,要取得此節點的bug也至少要有一個Troopers走過,但不一定留下

 

狀態轉移方程:dp[p][j] = MAX( dp[p][j], dp[p][j-k] + dp[tmp][k]);

dp[p][j] 表示p點用j個人攻打所得收益

之後就是揹包思想了

 

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 110;
struct node{
    int v, next;
}edge[2*maxn];
struct CC{
    int bug, w;
}cav[maxn];
int pre[maxn], value, m, n, dp[maxn][maxn], vis[maxn];
int MAX(int x, int y){
    return x>y? x:y;
}
void init(){
    int i, j, k, aa, bb;
    memset( pre, -1, sizeof( pre));
    value = 0;
    for( i= 1; i<= n; i++){
        scanf("%d%d", &cav[i].bug, &cav[i].w);
        cav[i].bug = (cav[i].bug + 19)/20;
    }
    for( i= 1; i<n; i++){
        scanf("%d%d", &aa, &bb);
        edge[value].v = bb;
        edge[value].next = pre[aa];
        pre[aa] = value++;
        edge[value].v = aa;
        edge[value].next = pre[bb];
        pre[bb] = value ++;
    }
}
void dfs( int p){
    int i, j, k, tmp;
    vis[p] = 1;
    for( i= cav[p].bug; i<= m; i++){
        dp[p][i] = cav[p].w;
    }
    for( i= pre[p]; i!= -1; i= edge[i].next){
        tmp = edge[i].v;
        if( vis[tmp]) continue;
        dfs(tmp);
        for( j= m; j>= cav[p].bug; j--){ // 0 1 揹包 dp[p][j] 不受 dp[p][j-1]影響
            for( k = 1; k<= j- cav[p].bug; k++){ //完全揹包 
                dp[p][j] = MAX( dp[p][j], dp[p][j-k] + dp[tmp][k]);
            }
        }
    }
}
int main(){
	//freopen("1.txt", "r", stdin);
	int mm, i;
    while( scanf("%d%d", &n, &m) && !( m == -1 && n== -1)){
        init();
        if( m == 0) {
            printf("0\n");
            continue;
        }
        memset( vis, 0, sizeof( vis));
        memset( dp, 0, sizeof( dp));
        dfs(1);
        printf("%d\n", dp[1][m]);
    }
	return 0;
}


 

發佈了69 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章