hdu1520アニバーサリーパーティーベーシックツリーdp

タイトルリンク:http : //acm.hdu.edu.cn/showproblem.php?pid=1520

一般的な考え方は、メンバーシップツリーを与えることです。各人はノードを表し、各ノードには値があり、親子関係を持つポイントのペアを1つだけ選択して、重みの合計を最大化する方法を尋ねます。

コードは次のとおりです。

1 #include <bits / stdc ++。h>
 2  名前空間std を使用 3 typedef unsigned int ui;
4 typedef long long ll;
5 typedef unsigned long long ull;
6 #define pf printf
 7 #define mem(a、b)memset(a、b、sizeof(a))
 8 #define prime1 1e9 + 7
 9 #define prime2 1e9 + 9
 10 #define pi 3.14159265
 11 #define lson l、 mid、rt << 1
 12 #define rson mid + 1、r、rt << 1 | 1
         13  #define scand(x)scanf( "%llf"、&x) 
 14  #define f(i、a、b)for(int i = a; i <= b; i ++)
 15  #define scan(a)scanf( "%d"、&a)
 16  #define mp(a、b)make_pair((a)、(b))
 17  #define Pペア<int、int>
 18  #define dbg(args)cout <<#args << ":" << args << endl;
19  #define inf 0x7ffffff
 20 inline int read(){
 21      int ans = 0、w = 1 ;
22      文字 ch = getchar();
23      (!(ch == ' - ')w = -1 ; ch = getchar();)
 24      while(isdigit(ch))ans =(ans << 3)+(ans << 1)+ ch- ' 0 '、 ch = getchar();
 25      return ans * w;
 26  }
 27  int n、m、t;
 28  const  int maxn = 1e4 + 10 ;
 29  int value [maxn];
 30  int dp [maxn] [ 2 ]; // 0この時点で選択されていない最大重量合計を示し、1はこの時点で選択されている最大重量合計を示し、
31ベクトル< int> G [maxn];
 32  int f [maxn]; // fの設定はルートノードを検索する
33  void dfs(int u)
 34  {
 35      dp [u] [ 0 ] = 0 ;
 36      dp [u] [ 1 ] =値[U]; // 両方の場合に参加し、初期値設定に参加していない
37      のためにINT I = 0 ; I <G [U] .size(); I ++ 38である     {
 39          INTソン= G [U] [i];
 40          dfs(息子); // DFS 
41          dp [u] [ 0] + = max(dp [son] [ 1 ]、dp [son] [ 0 ]); // 親ノードを選択しないと、子ノードを選択できるかどうかが
          決まります。42 dp [u] [ 1 ] + = dp [son] [ 0 ]; // 親ノードが選択された後、子ノードは
43      } 
 44  }
 45  int main()
 46  {
 47      // freopen( "input.txt"、 "r"、stdin);
 48      // freopen( " 
のみを選択できます     output.txt "、" w "、stdout); 49      std :: ios :: sync_with_stdio(false );
 50      while(〜scanf(" %d "、&n))
 51      {
52          f(i、1 、n)
 53          {
 54              scanf(" %d "、&value [i]);
55              G [i] .clear();
56              f [i] = -1 ;
57          }
 58          while1 59          {
 60              int a、b;
61              scanf(" %d%d "、&​​a、&b);
62              if(a == 0 && b == 0ブレーク;
63             G [b] .push_back(a);
64              f [a] = b;
65          }
 66          int t = 1 ;
67          while(f [t]!=- 1 68          {
 69              t = f [t];
70          }
 71          dfs(t);
72          printf(" %d \ n "、max(dp [t] [ 0 ]、dp [t] [ 1 ]));
73      }
 74 }

 

おすすめ

転載: www.cnblogs.com/randy-lo/p/12680508.html
おすすめ