2 条题解

  • 0
    @ 2023-12-23 9:17:31
    #include<bits/stdc++.h>
    using namespace std;
    int main()
    { 
     int n,i,j,a[105],x; bool b[105][105]={};
     char ch; 
     cin>>n; 
     for(i=1;i<=n;++i)
     {
       cin>>a[i];
       ch=getchar();
       while(ch==' '&&ch!='\\n')
       {
         cin>>x; 
         b[i][x]=1; 
         ch=getchar();
       }
     }
     for(i=n-1;i>=1;--i)
     { 
        int maxn=0; 
        for(j=i+1;j<=n;++j) 
        if(b[i][j])
        maxn=max(maxn,a[j]);
        a[i]+=maxn; 
      } 
      int maxn=0; 
      for(i=1;i<=n;++i) 
      maxn=max(maxn,a[i]);   
      cout<<maxn; 
      return 0; 
    }
    
    • 0
      @ 2022-11-13 19:26:21

      dfs会爆炸(确信),所以采用 dpdp

      #include<bits/stdc++.h>
      using namespace std;
      int n,i,tree[1005][1005],a[1005],len[1005],ma,dp[1005],j;
      char b;
      void write(int x) {
      	if(x<0){
      		putchar('-');
      		write(-x);
      		return;
      	}
      	if(x>=10)write(x/10);
      	putchar(x%10+'0');
      }
      int main()
      {
          cin>>n;
         for(i=1;i<=n;i++)
         {
            cin>>a[i];
            scanf("%c",&b);//用字符判断是否有儿子
            while(b==' ')
            {
              	cin>>tree[i][++len[i]];//输入
                  scanf("%c",&b);
            }
         }
         ma=dp[n]=a[n];
         for(i=n-1;i>=1;i--)//从尾往前
         {
            dp[i]=a[i];//初始化
            for(j=1;j<=len[i];j++)dp[i]=max(dp[i],a[i]+dp[tree[i][j]]);//加上它父亲的
            ma=max(ma,dp[i]);
         }
         write(ma);
         return 0;
      }
      • 1

      信息

      ID
      24
      时间
      1000ms
      内存
      256MiB
      难度
      5
      标签
      (无)
      递交数
      128
      已通过
      47
      上传者