题解 | #旅游#

旅游

http://www.nowcoder.com/practice/600dd094e1af43c4bcb32b58cd9c9394

描述

在一棵树上选择一些点,要求选择的点不相邻,问最多选多少点

思路

  • dp[i][0]dp[i][0]表示以ii为根的子树且不选ii节点最多能选多少点,dp[i][1]dp[i][1]表示以ii为根的子树且选ii节点最多能选多少点,令树的根为ss,由于ss节点必须选,则答案为dp[s][1]dp[s][1]
  • 转移方程为{dp[i][1]=vidp[v][0]dp[i][0]=vimax(dp[v][0],dp[v][1])\begin{cases}dp[i][1]=\sum_{v是i的儿子}dp[v][0]\\dp[i][0]=\sum_{v是i的儿子}max(dp[v][0],dp[v][1])\end{cases}

代码

#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e5+5;
int dp[MAXN][2];
vector<int> E[MAXN];
void dfs(int now,int fa)
{
    dp[now][1]=1;
    for(int v:E[now])
    {
        if(v==fa)
            continue;
        dfs(v,now);
        dp[now][1]+=dp[v][0];
        dp[now][0]+=max(dp[v][0],dp[v][1]);
    }
}
int main()
{
    int n,s;
    scanf("%d%d",&n,&s);
    for(int i=1;i<n;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        E[u].push_back(v);
        E[v].push_back(u);
    }
    dfs(s,s);
    printf("%d\n",dp[s][1]);
}

时间复杂度O(n)O(n),空间复杂度O(n)O(n)

全部评论

相关推荐

rndguy:个人思路,抛砖引玉。 要我的话我先问清楚需求:要什么精度,什么速度,什么环境。 如果精度要求很低,平台也有点柔性的话,只需要输出pwm,然后开个中断记录各多少个脉冲,如果脉冲时间不对齐了就反馈控制电流加减就行。要求同步要求稍微高点的话可以在脉冲间做个线性插值,同步精度会高些。 但总体来说,如果直流有刷只有脉冲没有好的编码器的话很难做精准定位什么的(除非用一些电机磁路结构相关的奇技淫巧如高频注入什么的),所以要求更高就需要大量参数辨识和校准,那就慢多了。
点赞 评论 收藏
分享
挥毫自在:想白嫖你呢
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务