poj2342(summerIv) 树状DP水题

来源:互联网 发布:mac恢复垃圾箱删除文件 编辑:程序博客网 时间:2024/06/06 21:39
参考:点击打开链接

需要特别注意的是这种题目一定要递归找到根节点再从根节点进行dfs,上面的链接中的代码就是因为没有进行这一步所以TLE

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=6000+50;int dp[maxn][2],root,father[maxn],vis[maxn];///二维数组不要两边都开这么大很容易MLEint employee,l,k;void dfs(int node){    vis[node]=1;    for(int i=1;i<=employee;i++)    {        if(!vis[i]&&father[i]==node)        {            dfs(i);        dp[node][0]=dp[node][0]+max(dp[i][1],dp[i][0]);        dp[node][1]=dp[node][1]+dp[i][0];        }    }}int main(){    while(scanf("%d",&employee)!=EOF)    {        memset(vis,0,sizeof(vis));        memset(dp,0,sizeof(dp));        memset(father,0,sizeof(father));        for(int i=1;i<=employee;i++)        scanf("%d",&dp[i][1]);    while(scanf("%d%d",&l,&k))    {        if(l==0&&k==0) break;        father[l]=k;    }    root=k;        while(father[root])            root=father[root];        dfs(root);    printf("%d\n",max(dp[root][0],dp[root][1]));    }    return 0;}