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