hdu 1011(树形dp)
2014-05-02 16:15
232 查看
Mark。看着吴神博客写的,还未完全懂。
View Code
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> #define MP(a, b) make_pair(a, b) #define PB(a) push_back(a) using namespace std; const int LEN = 2010; int W[LEN], V[LEN], n, m, dp[LEN][LEN]; vector<int> Map[LEN]; void dfs(int v, int fa){ for(int i=0; i<Map[v].size(); i++){ int x = Map[v][i]; if(x != fa){ dfs(x, v); for(int k=m; k>=V[v]; k--){ for(int j=1; j<=m; j++){ if(k>=j+V[v])dp[v][k] = max(dp[v][k], dp[v][k-j] + dp[x][j]); } } } } for(int i=V[v]; i<=m; i++) dp[v][i] += W[v]; } int main() { // freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int a, b; while(cin >> n >> m){ if(n < 0 && m < 0) break; for(int i=0; i<LEN; i++) Map[i].clear(); memset(dp, 0, sizeof dp); for(int i=0; i<n; i++){ cin >> V[i] >> W[i]; V[i] = (V[i]+19)/20; } for(int i=0; i<n-1; i++){ cin >> a >> b; a--, b--; Map[a].PB(b); Map[b].PB(a); } dfs(0, -1); if(!m) cout << 0 << endl; else cout << dp[0][m] << endl; } return 0; }
View Code
相关文章推荐
- hdu 1011 Starship Troopers 树形dp
- HDU 1011 Starship Troopers (树形DP)
- HDU 1011(树形DP)
- hdu 1011 Starship Troopers(树形DP)
- HDU 1011 Starship Troopers (树形DP, 简单题目)
- [HDU 1011] Starship Troopers 树形dp
- hdu 1011 树形dp
- HDU - 1011(树形dp 背包类型的做法)
- hdu 1011 树形dp
- HDU 1011 Starship Troopers---树形dp+有依赖的背包
- HDU1011 - Starship Troopers - 树形dp
- HDU 1011 Starship Troopers(树形DP)
- 【树形dp】hdu 1011 Starship Troopers
- 多校第七场 1011 hdu 5379 Mahjong tree(树形dp)
- HDU 1011(树形dp)
- hdu 1011 树形dp
- HDU-1011 Starship Troopers(树形dp)
- 多校第十场 1011 hdu 5416 CRB and Tree(树形dp)
- hdu 1011 Starship Troopers(树形DP+背包问题)
- HDU 1011 Starship Troopers (树形DP)