• E. Hanging Hearts


    Problem - E - Codeforces

    思路:我们考虑用树形dp,用f[i][0]表示以i为根,并且当前节点不在最长上升子序列中,用f[i][1]表示以i为根,当前节点在最长上升子序列中,那么f[i][0]+=max(f[j][0],f[j][1]),因为对于以i为根的子树来说,i的所有子节点组成的子树是没有关联的,所以不包含当前节点的最长上升子序列就是每个子节点的最长上升子序列的和,f[i][1]=max(f[i][1],f[j][1]+1),如果包含当前节点,因为我一定是在删除了所有的子节点之后才删除当前节点,所以我这个节点的值一定是子节点中除1之外的最小的值,并且它只有其中的某一个子节点能够等于这个值,那么我们为了让它最大,肯定是挑路径最长的那个子节点的值等于这个值,这样就能够让f[i][1]最大,所以f[i][1]只需要找以i为根的最长的路径就可以

    1. // Problem: E. Hanging Hearts
    2. // Contest: Codeforces - Codeforces Round 831 (Div. 1 + Div. 2)
    3. // URL: https://codeforces.com/problemset/problem/1740/E
    4. // Memory Limit: 256 MB
    5. // Time Limit: 1000 ms
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. #include
    15. #include
    16. #include
    17. #include
    18. #include
    19. #include
    20. #include
    21. #include
    22. #define fi first
    23. #define se second
    24. #define i128 __int128
    25. using namespace std;
    26. typedef long long ll;
    27. typedef double db;
    28. typedef pair<int,int> PII;
    29. typedef pair<int,pair<int,int> > PIII;
    30. const double eps=1e-7;
    31. const int N=5e5+7 ,M=5e5+7, INF=0x3f3f3f3f,mod=1e9+7,mod1=998244353;
    32. const long long int llINF=0x3f3f3f3f3f3f3f3f;
    33. inline ll read() {ll x=0,f=1;char c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
    34. while(c>='0'&&c<='9') {x=(ll)x*10+c-'0';c=getchar();} return x*f;}
    35. inline void write(ll x) {if(x < 0) {putchar('-'); x = -x;}if(x >= 10) write(x / 10);putchar(x % 10 + '0');}
    36. inline void write(ll x,char ch) {write(x);putchar(ch);}
    37. void stin() {freopen("in_put.txt","r",stdin);freopen("my_out_put.txt","w",stdout);}
    38. bool cmp0(int a,int b) {return a>b;}
    39. template<typename T> T gcd(T a,T b) {return b==0?a:gcd(b,a%b);}
    40. template<typename T> T lcm(T a,T b) {return a*b/gcd(a,b);}
    41. void hack() {printf("\n----------------------------------\n");}
    42. int T,hackT;
    43. int n,m,k;
    44. vector<int> h[N];
    45. int f[N][2];
    46. void dfs(int u,int fa) {
    47. f[u][1]=1;
    48. for(int i=0;isize();i++) {
    49. int j=h[u][i];
    50. if(j==fa) continue;
    51. dfs(j,u);
    52. f[u][0]+=max(f[j][0],f[j][1]);
    53. f[u][1]=max(f[u][1],f[j][1]+1);
    54. }
    55. }
    56. void solve() {
    57. n=read();
    58. for(int i=2;i<=n;i++) {
    59. int c=read();
    60. h[c].push_back(i);
    61. h[i].push_back(c);
    62. }
    63. dfs(1,-1);
    64. printf("%d\n",max(f[1][0],f[1][1]));
    65. }
    66. int main() {
    67. // init();
    68. // stin();
    69. //ios::sync_with_stdio(false);
    70. // scanf("%d",&T);
    71. T=1;
    72. while(T--) hackT++,solve();
    73. return 0;
    74. }

  • 相关阅读:
    CPDA|如何拥有数据分析思维?
    机组 硬件
    OpenGL笔记九之彩色三角形与重心插值算法
    蓝桥杯DP算法——区间DP(C++)
    Python的异常处理
    数据结构:双向循环带头链表
    商城|商城小程序|基于微信小程序的智慧商城系统设计与实现(源码+数据库+文档)
    uniapp小程序中给web-view页面添加授权弹窗(使用cover-view组件覆盖实现该功能)
    干货分享:有哪些好用的ocr图片文字识别软件?
    java-python高校大学教室管理系统
  • 原文地址:https://blog.csdn.net/zzzyyzz_/article/details/132781514