日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU1561 The more, The Better

發(fā)布時間:2024/9/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU1561 The more, The Better 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

HDU1561 The more, The Better

Time Limit: 6000/2000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8490????Accepted Submission(s): 4964

Problem Description

ACboy很喜歡玩一種戰(zhàn)略游戲,在一個地圖上,有N座城堡,每座城堡都有一定的寶物,在每次游戲中ACboy允許攻克M個城堡并獲得里面的寶物。但由于地理位置原因,有些城堡不能直接攻克,要攻克這些城堡必須先攻克其他某一個特定的城堡。你能幫ACboy算出要獲得盡量多的寶物應(yīng)該攻克哪M個城堡嗎?

?

?

Input

每個測試實(shí)例首先包括2個整數(shù),N,M.(1 <= M <= N <= 200);在接下來的N行里,每行包括2個整數(shù),a,b. 在第 i 行,a 代表要攻克第 i 個城堡必須先攻克第 a 個城堡,如果 a = 0 則代表可以直接攻克第 i 個城堡。b 代表第 i 個城堡的寶物數(shù)量, b >= 0。當(dāng)N = 0, M = 0輸入結(jié)束。

?

?

Output

對于每個測試實(shí)例,輸出一個整數(shù),代表ACboy攻克M個城堡所獲得的最多寶物的數(shù)量。

?

?

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

?

?

Author

8600

?

?

Source

HDU 2006-12 Programming Contest

?

?

Recommend

LL???|???We have carefully selected several similar problems for you:??1011?2159?2639?1203?2602?

?

分析:

典型的樹形dp的題目。

首先,限制條件是選擇m個物品,而每個物品最多選一次,跟0-1背包的區(qū)別在于有依賴關(guān)系,那么這層依賴關(guān)系我們可以借助于一個樹來解決。借助dfs,從根節(jié)點(diǎn)開始dfs,然后直到葉子節(jié)點(diǎn),回朔的時候進(jìn)行0-1背包dp。

dp[i][j]表示以i為根節(jié)點(diǎn)取j個節(jié)點(diǎn)(包括根)的最優(yōu)值

map[i][j]表示i號節(jié)點(diǎn)的第j個孩子是什么

??

num[i]表示i號節(jié)點(diǎn)的孩子數(shù)

???

vis[i]==0表示i號節(jié)點(diǎn)沒有被訪問

??
????

?

dp[i][j]=max(dp[i][j],dp[i][k]+dp[i的某個孩子節(jié)點(diǎn)][j-k])

表示在父親節(jié)點(diǎn)i中選k個點(diǎn)和在i的某個孩子中選j-k個點(diǎn)

我們可以知道dp[i][1]=val[i],因?yàn)檫x一個點(diǎn)的話必須選自己 = =

依賴關(guān)系形成森林,要先把樹轉(zhuǎn)換成森林才能進(jìn)行樹形DP

增加一個根節(jié)點(diǎn)0即可

答案即為dp[0][m+1]:因?yàn)樵黾恿艘粋€根節(jié)點(diǎn)

?

?

?

1 #include<stdio.h> 2 #include<string.h> 3 int n,m; 4 int num[250]; 5 int map[250][250]; 6 int dp[250][250]; 7 bool vis[250]; 8 int max(int a,int b){ 9 return a>b?a:b; 10 } 11 void dfs(int p) 12 { 13 int i,j,k; 14 //將p的訪問置為true 15 vis[p]=true; 16 //遍歷p的所有孩子 17 for(i=1;i<=num[p];i++) 18 { 19 //t是節(jié)點(diǎn)p的第i個孩子 20 int t=map[p][i]; 21 //如果t沒被訪問,dfs它 22 if(!vis[t]) dfs(t); 23 //m反向過來是保證后面的數(shù)據(jù)不影響前面的,比如當(dāng)m=5時,j=m,k=2時,等式右邊出現(xiàn)過一次dp[p][2] 24 //而當(dāng)m=5時,j=2,k=2時, 狀態(tài)轉(zhuǎn)移方程等式左邊出現(xiàn)了dp[p][2],顯然,這個出現(xiàn)的dp[p][2]不能影響右邊那個dp[p][2] 25 for(j=m;j>=2;j--)//選擇1個的狀態(tài)不用更新了,就是節(jié)點(diǎn)本身,初始化中已經(jīng)做了 26 { 27 for(k=1;k<j;k++)//k表示父親需要取的點(diǎn)的個數(shù),j-k表示孩子需要取的點(diǎn)的個數(shù) 28 { 29 //如果有值 30 if(dp[t][j-k]!=-1&&dp[p][k]!=-1) 31 dp[p][j]=max(dp[p][j],dp[p][k]+dp[t][j-k]); 32 } 33 } 34 } 35 } 36 int main() 37 { 38 int i,j; 39 while(scanf("%d%d",&n,&m),n||m) 40 { 41 int a,b; 42 dp[0][1]=0; 43 memset(num,0,sizeof(num)); 44 for(i=1;i<=n;i++){ 45 scanf("%d%d",&a,&b); 46 //初始化 47 dp[i][1]=b; 48 map[a][++num[a]]=i; 49 } 50 m++;//增加一個點(diǎn),森林轉(zhuǎn)換成樹 51 //初始化 52 for(i=0;i<=n;i++){ 53 dp[i][0]=0;vis[i]=0; 54 for(j=2;j<=m;j++){ 55 dp[i][j]=-1; 56 } 57 } 58 dfs(0); 59 printf("%d\n",dp[0][m]); 60 } 61 return 0; 62 }

?

?

沒過的代碼:

錯誤:第30行的g[a][++num[a]]=i;這里寫成了g[a][++num[i]]=i;?

1 #include <bits/stdc++.h> 2 const int N=2e2+10; 3 using namespace std; 4 int dp[N][N],m,n; 5 int num[N],g[N][N]; 6 bool vis[N]; 7 8 void dfs(int r){ 9 vis[r]=true; 10 for(int i=1;i<=num[r];i++){ 11 int v=g[r][i]; 12 if(!vis[v]) dfs(v); 13 for(int j=m;j>=2;j--){ 14 for(int k=1;k<j;k++){ 15 //這里可以判斷一下如果有值的話 16 if(dp[r][k]!=-1&&dp[v][j-k]!=-1) 17 dp[r][j]=max(dp[r][j],dp[r][k]+dp[v][j-k]); 18 } 19 } 20 } 21 } 22 23 int main(){ 24 freopen("in.txt","r",stdin); 25 memset(dp,-1,sizeof(dp)); 26 while(scanf("%d %d",&n,&m),n||m){ 27 for(int i=1;i<=n;i++){ 28 int a,w; 29 cin>>a>>w; 30 g[a][++num[a]]=i;//存孩子 //這里寫成了g[a][++num[i]]=i; 31 dp[i][1]=w; 32 dp[i][0]=0; 33 } 34 dp[0][1]=0; 35 dp[0][0]=0; 36 m++; 37 dfs(0); 38 cout<<dp[0][m]<<endl; 39 } 40 41 42 return 0; 43 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/Renyi-Fan/p/7430988.html

總結(jié)

以上是生活随笔為你收集整理的HDU1561 The more, The Better的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产一区二区三区视频免费观看 | 亚洲综合情 | 免费观看毛片网站 | 久久久精品免费 | 精品无码久久久久久久久成人 | 影音先锋丝袜制服 | 夜夜夜爽 | 亚洲熟悉妇女xxx妇女av | 欧美videossex极品 | 91一区在线观看 | 1024手机在线观看 | 香蕉视频国产在线观看 | 国产自偷自拍 | 加勒比精品 | 欧美黑人巨大xxx极品 | 国产毛片在线 | 中文字幕在线播出 | 91av免费观看 | www四虎精品视频免费网站 | 播播激情网 | 少妇高潮喷水在线观看 | 精品视频在线免费看 | 久久久久亚洲av成人无码电影 | 欧美久久久久久久久久久久久久 | 91玉足脚交嫩脚丫在线播放 | 香蕉成人网 | juliaann精品艳妇hd | 国产色视频在线 | 2023天天操| 亚洲欧洲综合在线 | 6080午夜伦理 | 国产欧美亚洲精品 | 亚洲女优在线观看 | aa黄色大片 | 热re99久久精品国产99热 | 久久人妻少妇嫩草av无码专区 | 日韩亚洲影院 | 亚洲第一区在线播放 | 激情超碰 | 国产91在线亚洲 | 欧美精品免费一区二区 | 岳奶大又白下面又肥又黑水多 | 在线国产小视频 | 国产做爰xxxⅹ高潮视频12p | 精精国产xxxx视频在线播放 | 奇米影视播放器 | 久久久夜| 国产精品美女一区 | 九九久久精品视频 | 日一日干一干 | 日韩欧美中文字幕在线播放 | 超碰男人的天堂 | 色爽爽一区二区三区 | 伊人免费在线观看高清版 | 久久成年人视频 | 国产精品入口夜色视频大尺度 | 伊人快播 | 欧美精品毛片 | 国产精品综合在线 | 日韩欧美第一页 | 黄色成人免费观看 | 中文字幕在线三区 | 国产精品天美传媒入口 | 四季av国产一区二区三区 | 亚洲麻豆av| 日本不卡网 | 黄色毛毛片 | 麻豆理论片 | 欧美成人乱码一区二区三区 | 精品黑人一区二区三区在线观看 | 国产 一二三四五六 | 欧美在线视频网站 | 特级性生活片 | 亚洲一级淫片 | 91视频社区| 精品国产三级片在线观看 | 一起操网站 | 中文一区二区在线观看 | 顶级尤物极品女神福利视频 | 天堂免费在线视频 | a天堂资源在线观看 | 91九色国产 | 天天做天天摸天天爽天天爱 | 欧美日韩亚洲一区二区三区 | 国产精品污视频 | 欧美福利专区 | 日韩av三级在线观看 | 日韩av专区| 性网站在线观看 | 色漫在线观看 | 色五丁香 | av不卡中文字幕 | 第一页在线视频 | 亚洲天堂网站 | a毛片大片 | 国产理论av | 女女调教被c哭捆绑喷水百合 | av激情久久| 艳妇乳肉豪妇荡乳xxx |