POJ 2342

来源:互联网 发布:php bug管理系统 编辑:程序博客网 时间:2024/04/27 06:26

树状DP第一题,,,刚开始的时候看了一个描述,说是要把多叉树改成二叉树,结果就以为每道题都要这样,倒腾了很久都没开始。。。然后后来看了一下代码。。。。

其实这道题算是入门题,不难,但是有一点不大清楚,就是如果有分离开的两棵树要怎么办。可能是我题目没有看清楚。。。。

跑了110ms...

#include <stdio.h>#include <string.h>#define maxn 6010int father[maxn],n;int dp[maxn][2];int vis[maxn];int max(int x,int y){    if(x>y) return x;    else return y;}void find(int x){    int i,j,k;    vis[x]=1;    for(i=1;i<=n;i++)        if(!vis[i]&&father[i]==x)    {        find(i);        dp[x][0]+=max(dp[i][0],dp[i][1]); //       printf("**%d  %d  %d  %d\n",dp[i][0],dp[i][1],dp[x][0],i);        dp[x][1]+=dp[i][0];    }}int main(){    while(scanf("%d",&n)!=EOF)    {        int i,j,k;        int root=0;        memset(dp,0,sizeof(dp));        memset(father,0,sizeof(father));        memset(vis,0,sizeof(vis));        for(i=1;i<=n;i++) scanf("%d",&dp[i][1]);     //   printf("$$%d\n",dp[7])        while(scanf("%d%d",&j,&k)!=EOF&&j+k)        {            father[j]=k;            root=k;        }        find(k);        printf("%d\n",max(dp[root][1],dp[root][0]));    }    return 0;}


0 0
原创粉丝点击