zoukankan      html  css  js  c++  java
  • loj10153 二叉苹果树

    传送门

    分析

    一道简单的树型dp,我们用dp[i][j]记录考虑到第i个点,保留了j个树枝的最多苹果数,然后dfs求解即可。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    #define pb push_back
    #define mp make_pair
    vector<pair<int,int> >v[110];
    pair<int,int>son[2][110];
    int dp[110][110],n,m;
    inline void dfs(int x,int fa){
          int cnt=-1;
          for(int i=0;i<v[x].size();i++)
            if(v[x][i].first!=fa){
              son[++cnt][x]=v[x][i];
              dfs(v[x][i].first,x);
            }
          return;
    }
    inline void getdp(int x){
          if(!son[0][x].first)return;
          getdp(son[0][x].first);
          getdp(son[1][x].first);
          for(int i=0;i<n-2;i++)
            for(int j=0;j<=i;j++)
              dp[x][i+2]=max(dp[x][i+2],dp[son[0][x].first][j]+
              dp[son[1][x].first][i-j]+son[0][x].second+son[1][x].second);
          for(int i=0;i<n-1;i++)
            for(int j=0;j<=i;j++)
              dp[x][i+1]=max(dp[x][i+1],max(dp[son[0][x].first][j]+
              son[0][x].second,dp[son[1][x].first][i-j]+son[1][x].second));
          return;
    } 
    int main(){
          int i,j,k,x,y;
          scanf("%d%d",&n,&m);
          for(i=1;i<n;i++){
              scanf("%d%d%d",&x,&y,&k);
              v[x].pb(mp(y,k));
              v[y].pb(mp(x,k));
          }
          memset(dp,0,sizeof(dp));
          dfs(1,0);
          getdp(1);
          printf("%d
    ",dp[1][m]);
          return 0;
    }
  • 相关阅读:
    泛型方法
    Javascript操作Cookie[3]
    委托的发展
    selectorUI元素状态伪类
    服务器端操作Cookie[2]
    泛型
    Action<T>泛型委托
    Javascript创建对象的流程
    Cookie[1]
    后缀名是exe的文件 的打开方式
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9520249.html
Copyright © 2011-2022 走看看