zoukankan      html  css  js  c++  java
  • HDOJ 1561

       刚看题...觉得这不是棵树...可能有回路...仔细一想..这还真是棵树(森林)...这是由于每个城堡所需要提前击破的城堡至多一个..对于一个城堡.其所需提前击破的城堡作为其父亲构图....

       dp[k][i]代表以k为跟的子树击破i个城堡所能获得的最大收益...泛化背包问题...


    Program:

    #include<iostream>
    #include<stack>
    #include<queue>
    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    #include<cmath>
    #define ll long long
    #define oo 1000000007
    #define MAXN 205
    using namespace std;
    vector<int> Tree[MAXN];
    int n,m,v[MAXN],ans[MAXN],dp[MAXN][MAXN];
    bool root[MAXN];
    void dfs(int x,int t)
    {
          int i,j,k,num;
          if (t>m) return;
          dp[x][1]=v[x]; 
          num=Tree[x].size();
          for (i=0;i<num;i++)
          {
                dfs(Tree[x][i],t+1); 
                for (j=m;j>=1;j--)
                   for (k=1;k<=m-j;k++)
                      dp[x][j+k]=max(dp[x][j+k],dp[x][j]+dp[Tree[x][i]][k]);
          }
          return;
    }
    int main()
    {
          int i,j,k; 
          while (~scanf("%d%d",&n,&m) && n && m)
          {
                 for (i=1;i<=n;i++) Tree[i].clear();
                 memset(root,true,sizeof(root));
                 for (i=1;i<=n;i++)
                 {
                       int x,c;
                       scanf("%d%d",&x,&c);
                       Tree[x].push_back(i);
                       v[i]=c;
                       if (x) root[i]=false;
                 }
                 memset(dp,0,sizeof(dp));
                 memset(ans,0,sizeof(ans));
                 for (i=1;i<=n;i++)
                   if (root[i])
                   {
                          dfs(i,1);
                          for (j=m;j>=0;j--)
                             for (k=0;k<=m-j;k++)
                                 ans[j+k]=max(ans[j+k],ans[j]+dp[i][k]);
                   }
                for (i=m;i>=0;i--)
                  if (ans[i]) break;
                printf("%d
    ",ans[i]);
          }
          return 0;
    }
    


  • 相关阅读:
    计划任务工具-windows
    [JavaWeb基础] 017.Struts2 和 ajax交互简介
    html5学习之路_007
    [PHP学习教程
    [PHP学习教程
    [注]还原记忆力的真面目
    理解Java对象序列化
    HashTable和HashMap的区别详解
    HDFS NameNode内存全景
    HDFS 原理、架构与特性介绍
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3209232.html
Copyright © 2011-2022 走看看