DP:树DP

DP:树DP

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

The more, The Better

Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5414    Accepted Submission(s): 3217




Problem Description
ACboy非常喜欢玩一种战略游戏,在一个地图上,有N座城堡。每座城堡都有一定的宝物,在每次游戏中ACboy同意攻克M个城堡并获得里面的宝物。但因为地理位置原因。有些城堡不能直接攻克,要攻克这些城堡必须先攻克其它某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?

 


Input
每一个測试实例首先包含2个整数,N,M.(1 <= M <= N <= 200);在接下来的N行里。每行包含2个整数。a,b. 在第 i 行,a 代表要攻克第 i 个城堡必须先攻克第 a 个城堡,假设 a = 0 则代表能够直接攻克第 i 个城堡。

b 代表第 i 个城堡的宝物数量, b >= 0。当N = 0, M = 0输入结束。

 


Output
对于每一个測试实例。输出一个整数。代表ACboy攻克M个城堡所获得的最多宝物的数量。
 


Sample Input
   
   
3 2 0 1 0 2 0 3 7 4 2 2 0 1 0 4 2 1 7 1 7 6 2 2 0 0

 


Sample Output
   
   
5 13

dp[i][j]表示以i为根节点j个子节点的最大值。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<limits.h>
#include<vector>
typedef long long LL;
using namespace std;
const int maxn=220;
int v[maxn];
int n,m;
int dp[maxn][maxn];
vector<int>s[maxn];
void tree_dp(int n,int f)
{
    int len=s[n].size();
    dp[n][1]=v[n];
    for(int i=0;i<len;i++)
    {
        if(f>1)  tree_dp(s[n][i],f-1);
        for(int j=f;j>=1;j--)
        {
            for(int k=1;k<=j;k++)
                dp[n][j+1]=max(dp[n][j+1],dp[n][j+1-k]+dp[s[n][i]][k]);
        }
    }
}
int main()
{
    int f;
    while(~scanf("%d%d",&n,&m)&&(n+m))
    {
        v[0]=0;
        memset(dp,0,sizeof(dp));
        for(int i=0;i<=n;i++)
            s[i].clear();
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&f,&v[i]);
            s[f].push_back(i);
        }
        tree_dp(0,m+1);
        printf("%d\n",dp[0][m+1]);
    }
    return 0;
}

Anniversary party

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 4329   Accepted: 2463

Description

There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure of employees. It means that the supervisor relation forms a tree rooted at the rector V. E. Tretyakov. In order to make the party funny for every one, the rector does not want both an employee and his or her immediate supervisor to be present. The personnel office has evaluated conviviality of each employee, so everyone has some number (rating) attached to him or her. Your task is to make a list of guests with the maximal possible sum of guests' conviviality ratings.

Input

Employees are numbered from 1 to N. A first line of input contains a number N. 1 <= N <= 6 000. Each of the subsequent N lines contains the conviviality rating of the corresponding employee. Conviviality rating is an integer number in a range from -128 to 127. After that go N – 1 lines that describe a supervisor relation tree. Each line of the tree specification has the form: 

L K 

It means that the K-th employee is an immediate supervisor of the L-th employee. Input is ended with the line 

0 0 

Output

Output should contain the maximal sum of guests' ratings.

Sample Input

7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0

Sample Output

5

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<limits.h>
typedef long long LL;
using namespace std;
const int maxn=6005;
int dp[maxn][2],pre[maxn];
int visit[maxn],n;
void tree_dp(int x)
{
    visit[x]=1;
    for(int i=1;i<=n;i++)
    {
//        cout<<"111  "<<i<<endl;
        if(!visit[i]&&pre[i]==x)
        {
            tree_dp(i);
            dp[x][1]+=dp[i][0];
            dp[x][0]+=max(dp[i][1],dp[i][0]);
        }
    }
}

int main()
{
    while(~scanf("%d",&n))
    {
        memset(dp,0,sizeof(dp));
        memset(visit,0,sizeof(visit));
        memset(pre,0,sizeof(pre));
        for(int i=1;i<=n;i++)
           scanf("%d",&dp[i][1]);
        int x,y,root;
        while(~scanf("%d%d",&x,&y)&&(x+y))
        {
            pre[x]=y;
            root=y;
        }
        while(pre[root])
            root=pre[root];
 //       cout<<"fuck   "<<root<<endl;
        tree_dp(root);
        printf("%d\n",max(dp[root][0],dp[root][1]));
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117734.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux下tar解压到当前目录,zip压缩,tar压缩,tar解压[通俗易懂]

    Linux下tar解压到当前目录,zip压缩,tar压缩,tar解压[通俗易懂]很多时候我们需要把文件解压到当前目录,命令如下:tar-zxvfvscode-server-linux-x64.tar.gz-C./有时候很讨厌,因为tar.gz的包里就存在一个与压缩包同名的目录,这种情况的话需要先解压,再拷贝:tar-zxvfvscode-server-linux-x64.tar.gz-C./mvvscode-server-linux-x64/*….

    2022年5月11日
    73
  • SQLPrompt关闭联网

    SQLPrompt关闭联网一、介绍1.1、SQLPromptSQLPrompt是一款SQL开发智能提示和补齐插件,方便查询表结果,避免了开发人员一个个敲查询语句、执行语句等,但是插件收费。1.2、SQLSearch同时还推荐一个同系列同公司推出的SQLSearch插件,这个插件免费,这款插件可以在库里快速查找关键字,包括表名、列名、字段名、函数或存储过程及索引等中出现的关键字,也是一个极为有用的插件利器。…

    2022年7月14日
    36
  • PyCharm + Anaconda + QT

    PyCharm + Anaconda + QT前言:我已经安装了Anaconda和Pycharm(教程网上有很多)配置过程:1、cmd中运行:pipinstallPyQt5-ihttps://pypi.douban.com/simple安装常用工具:pipinstallPyQt5-tools-ihttps://pypi.douban.com/simple然后,在D:\Anaconda3\Lib\site-packages路径下可以看到新安装的工具包和qt5:…

    2022年8月27日
    3
  • Git创建远程分支并提交代码到远程分支

    Git创建远程分支并提交代码到远程分支1、可以通过gitbranch-r命令查看远端库的分支情况如图所示,远程仓库只有一个master分支2、从已有的分支创建新的分支(如从master分支),创建一个dev分支但此时并没有在远程仓库上创建分支如图所示还是只有一个master分支3、建立本地到远端仓库的链接–这样代码才能提交上去使用命令行gitpush–set-…

    2022年6月30日
    36
  • 多值依赖的简单理解_第四范式智能客服官网

    多值依赖的简单理解_第四范式智能客服官网1.多值依赖1.1多值依赖:多值依赖属4nf的定义范围,比函数依赖要复杂得多。在关系模式中,函数依赖不能表示属性值之间的一对多联系,这些属性之间有些虽然没有直接关系,但存在间接的关系,把没有直接联系、但有间接的联系称为多值依赖的数据依赖。在函数依赖中,X与Y是否存在函数依赖关系,只需考察X,Y的两组属性,与别的属性无关。而在多值依赖中,X与Y是否存在多值依赖还需看属性Z。1.2数…

    2025年6月20日
    7
  • pda手持终端软件下载_成为pda

    pda手持终端软件下载_成为pdaPDAF点亮主要参考《MT6763_MT6757_PDAF_Driver_and_Buf_mgr_Porting_Guide.pdf》1、什么是PDAF1.1PDAF的原理在了解相位对焦PDAF,PhaseDetectionAutoFocus之前,在网上肯定会搜到其他对焦方式。比如对比度对焦(反差对焦)CDAF,ContrastDetectionAutoFocus、激光对焦LDAF,LaserDetectionAutoFocus、双核对焦等。…

    2025年9月23日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号