RQNOJ愚蠢的矿工

题目描述

背景

Stupid 家族得知在HYC家的后花园里的中央花坛处,向北走3步,向西走3步,再向北走3步,向东走3步,再向北走6步,向东走3步,向南走12步,再向西走2步( - -||)就能找到宝藏的入口,而且宝藏都是藏在山里的,必须挖出来,于是Stupid家族派狗狗带领矿工队去挖宝藏.(HYC家的宝藏被狗狗挖走后有什么感想?)

描述

这个宝藏的制造者为了掩盖世人耳目,他做的宝藏是没有出口,只有入口,不少建造宝藏的人都死在里面.现在知道宝藏总共有N个分岔口,在分岔口处是有财宝的,每个宝藏点都有一个财富值.狗狗只带了M个人来,而且为了安全起见,在每个分岔口,必须至少留一个人下来,这个留下来的人可以挖宝藏(每个人只能挖一个地方的宝藏),这样才能保证不会迷路,而且这个迷宫有个特点,任意两点间有且只有一条路可通.狗狗为了让他的00开心,决定要尽可能地多挖些宝藏回去.现在狗狗的圈叉电脑不在身旁,只能求救于你了,你要知道,狗狗的终身幸福就在你手上了..(狗狗ps:00,你不能就这样抛弃偶……)

输入格式

第1行:两个正整数N,M .N表示宝藏点的个数,M表示狗狗带去的人数(那是一条懒狗,他自己可不做事)。(n<=1000,m<=100)

第2行:N个整数,第i个整数表示第i个宝藏的财富值.(保证|wi|<maxint)

第N+2行:两个非负整数A和B,表示A通向B,当A=0,表示A是入口.(保证A,B<=n)

输出格式

输出狗狗能带回去的宝藏的价值。

#include<string.h>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=301;

struct list
{
	int l;
	int r;
}node[2001];

int val[2001];

int vis[2001][101];
int m,n;

int dp(int x,int m)
{
	if(m==0)
	return 0;
	if(vis[x][m]!=-1)
	return vis[x][m];
	if(x==0)
	return 0;
	int ans=0;
	ans=dp(node[x].r,m);
	for(int i=0;i<m;i++)
	ans=max(ans,dp(node[x].l,i)+val[x]+dp(node[x].r,m-i-1));
	vis[x][m]=ans;
	return ans;
}

int main()
{
	int i;
	scanf("%d%d",&n,&m);
	memset(vis,-1,sizeof(vis));
	for(i=1;i<=n;i++)
	scanf("%d",&val[i]);
	for(i=0;i<=n;i++)
	node[i].l=node[i].r=0;
	for(i=1;i<=n;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		node[b].r=node[a].l;
		node[a].l=b;
	}
	cout<<dp(node[0].l,m)<<endl;
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值