当前位置:   article > 正文

洛谷P2016 战略游戏 - 树形DP_洛谷 树上dp

洛谷 树上dp

一、题目

战略游戏

二、分析

dp1[i] : 第i个节点站士兵,照亮以i为节点的子树所需最少的士兵数;

dp0[i] : 第i个节点不站士兵,照亮以i为节点的子树所需最少的士兵数;

状态转移方程

dp1[i] = \sum min(dp1[j],dp0[j])

dp0[j]=\sum dp1[j]

三、代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=2000;
  4. int h[N],e[N*2],ne[N*2],idx;
  5. int n;
  6. int dp0[N],dp1[N];
  7. bool st[N];
  8. void add(int a,int b)
  9. {
  10. e[idx]=b;
  11. ne[idx]=h[a];
  12. h[a]=idx++;
  13. }
  14. void dfs(int root)
  15. {
  16. dp1[root]=1;
  17. dp0[root]=0;
  18. for(int i=h[root];i!=-1;i=ne[i])
  19. {
  20. int j=e[i];
  21. if(!st[j])
  22. {
  23. st[j]=true;
  24. dfs(j);
  25. st[j]=false;
  26. dp1[root]+=min(dp1[j],dp0[j]);
  27. dp0[root]+=dp1[j];
  28. }
  29. }
  30. }
  31. int main()
  32. {
  33. cin>>n;
  34. for(int i=0;i<n;i++)
  35. h[i]=-1;
  36. for(int i=1;i<=n;i++)
  37. {
  38. int k,a,b;
  39. cin>>a>>k;
  40. for(int j=1;j<=k;j++)
  41. {
  42. cin>>b;
  43. add(a,b),add(b,a);
  44. }
  45. }
  46. int Min=0x3f3f3f3f;
  47. for(int i=0;i<n;i++)
  48. {
  49. st[i]=true;
  50. dfs(i);
  51. st[i]=false;
  52. Min=min(Min,min(dp0[i],dp1[i]));
  53. }
  54. cout<<Min<<endl;
  55. return 0;
  56. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/996506
推荐阅读
  

闽ICP备14008679号