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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章