zoukankan      html  css  js  c++  java
  • 舞会(lgP1352)

    写了一个多小时,本来觉得 bfs 能过然后码了好久发现不会确定顺序,又重新写了一遍 dfs /kk

    好吧其实是因为我记得上次做这题的时候写的是 bfs

    (f[i][0]) 表示以 (i) 为根的子树当 (i) 不去时的最大快乐值, (f[i][1]) 表示以 (i) 为根的子树当 (i) 去时的最大快乐值。

    显然当 (i) 去的时候它的所有下属一定都不去,当 (i) 不去的时候它的下属可能去也可能不去。因此得到状态转移方程:

    (f[x][0]+=max(f[tr[x][i]][0],f[tr[x][i]][1]))

    (f[x][1]+=f[tr[x][i]][0])

    对于整棵树从根开始一遍 dfs 一边转移即可。

    #include<bits/stdc++.h>
    using namespace std;
    vector<int>tr[5001];
    int n,a[5001];
    int f[5001][2];
    void dp(int x)
    {
     	f[x][0]=0;
     	f[x][1]=a[x];
     	for(int i=0;i<tr[x].size();i++)
     	{
      		dp(tr[x][i]);
     		f[x][0]+=max(f[tr[x][i]][0],f[tr[x][i]][1]);
    		f[x][1]+=f[tr[x][i]][0];
    	}
    }
    int main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    	for(int i=1;i<n;i++)
    	{
    		int x;
    		scanf("%d",&x);
    		tr[x].push_back(i+1);
    	}
    	dp(1);
    	cout<<max(f[1][0],f[1][1])<<endl;
    	return 0;
    }
    

    qwq

  • 相关阅读:
    201006120100630
    2010080120100901
    20101120至20101220
    201155学习总结
    PublishReport.rss
    windowservice创建及部署
    提示要角色管理工具安装Microsoft .NET Framework 3.5
    部署SSIS包
    ETL及SSIS
    IbatisNet
  • 原文地址:https://www.cnblogs.com/ying-xue/p/wu-hui.html
Copyright © 2011-2022 走看看