HDU 4003Find Metal Mineral

來源:互聯網
上載者:User

題目 :http://acm.hdu.edu.cn/showproblem.php?pid=4003

題目類型:樹形DP,參看別人的代碼AC的。首先定義DP[i][j],為根節點i往子節點投放j個 機器人所需的最小花費。

根據題意可以知道,機器人是可以走回頭路的。稍微分析下可以知道,如果從根節點派往子節點如果要折回到根節點,派向這個子節點的機器人越多,產生的重複路徑就會越多,所以那麼派往這個子節點的個數為1時是最優策略。那麼定義DP[i][0]存放1個機器人,從子節點返回到根節點的花費。

關鍵是思考:如果 根節點s, 有 n個子節點,那麼要怎麼樣選擇才能使dp[s][k]的值最小呢?

⑴當機器人的個數為1時,那麼只有一種方法,就事用這一個機器人跑遍每個子節點、也就是每次機器人都要從一個子節點返回根節點,然後走向另一個節點,直到遍曆所有點位止。那麼這種狀態下的狀態轉移為: dp[s][0]=dp[next][0]+2*w;       (其中s為根節點,next為子節點,w為s到next的權值)。

⑵當機器人的個數>1時,那麼必然存在機器人不必返回根節點的策略。同時由⑴也可以求出折回根節點的花費。

那麼求根節點s下的n個子節點,把每個節點看做一個整體,定義s(n,j)為前n個節點派j個機器人的最小花費,很容易發現這也是個DP,其實就是個背包,s(n-1,j)與s(n,j)必然存在某種聯絡。可以推出s(n,j)=min(s(n,j), s(n-1,j-k)+dp[v][k]+k*w);  (1<=k<=j,w為s到當前這個子節點v的權值)。因為只要用到上一個子節點的狀態,所以對起始點s的所有子節點掃描一遍就可以了。

其實這題的樹形DP,就是 DP套DP。

下面是 AC代碼:

#include<iostream>#include<vector>using namespace std;#define N 10010struct node{int v,w;node(int _v,int _w):v(_v),w(_w){}};vector<node> path[N];int dp[N][12];    //節點i,向子節點放j個 機器人的最小花費 int n,s,k;int min(int a,int b){ return a>b?b:a; }void dfs(int u,int father){int i,j,jj;for(i=0;i<path[u].size();i++){int next=path[u][i].v;int w=path[u][i].w;if(father==next)  continue;                     //如果當前的節點為父親節點,不往下走。if(father==-1||father!=next)                    //如果u為s點 (最上面的那個根節點)或者next不等於父親節點//cout<<next<<" "<<u<<endl,dfs(next,u);//cout<<next<<endl;for(j=k;j>=1;j--){dp[u][j]+=dp[next][0]+2*w;                     for(jj=1;jj<=j;jj++)dp[u][j]=min(dp[u][j],dp[u][j-jj]+dp[next][jj]+jj*w);}dp[u][0]+=dp[next][0]+2*w;}}int main(){int i,x,y,w;while(cin>>n>>s>>k){for(i=0;i<=10000;i++)path[i].clear();memset(dp,0,sizeof(dp));for(i=0;i<n-1;i++){scanf("%d%d%d",&x,&y,&w);path[x].push_back(node(y,w));path[y].push_back(node(x,w));}dfs(s,-1);printf("%d\n",dp[s][k]);}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.