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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

poj 2057 树形DP,数学期望

發(fā)布時(shí)間:2023/12/31 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 2057 树形DP,数学期望 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:http://poj.org/problem?id=2057

題意:有一只蝸牛爬上樹(shù)睡著之后從樹(shù)上掉下來(lái),發(fā)現(xiàn)后面的"房子"卻丟在了樹(shù)上面, 現(xiàn)在這只蝸牛要求尋找它的房子,它又得從樹(shù)根開(kāi)始爬起,現(xiàn)在要求一條路徑使得其找到房子
所要爬行的期望距離最小. 爬行距離如下計(jì)算, 題目規(guī)定每一個(gè)分支和枝末都看做是一個(gè)節(jié)點(diǎn), 這些節(jié)點(diǎn)之間的距離都是1, 在分支上可能會(huì)有熱心的毛毛蟲(chóng), 這些毛毛蟲(chóng)會(huì)如實(shí)的告訴蝸牛他之前是否經(jīng)過(guò)這條路徑, 也正是因?yàn)槊x(chóng), 因此詢問(wèn)毛毛蟲(chóng)的順序使得這題的期望是不同的. 輸入數(shù)據(jù)時(shí)給定的一個(gè)鄰接關(guān)系,通過(guò)上一個(gè)節(jié)點(diǎn)來(lái)構(gòu)圖 ;同時(shí)字符 'Y'表示該點(diǎn)有毛毛蟲(chóng), 字符'N'表示該點(diǎn)

分析:

die[i]表示以 i 為根結(jié)點(diǎn)找不到房子時(shí)要爬行的最少距離。

當(dāng) i 沒(méi)有毛毛蟲(chóng)的時(shí)候 ?j 是 i 的子節(jié)點(diǎn)。

當(dāng) i 有毛毛蟲(chóng)的時(shí)候 ;

?

win[i]表示以 i 為根結(jié)點(diǎn)時(shí),選好所有分支后,枚舉完所有房子落在所有葉子結(jié)點(diǎn)的時(shí)候,要爬的最短距離。

就是說(shuō):當(dāng)我走到 j 而找到時(shí),前面的都失敗了。而 j 成功了。j 子樹(shù) 又有很多葉子結(jié)點(diǎn)。其中只有一個(gè)是成功的(并不知道是哪個(gè))。

如圖:

?

然后就是對(duì)于 i 結(jié)點(diǎn)來(lái)說(shuō),怎么訪問(wèn)才使得重復(fù)結(jié)點(diǎn)最少。

那就是?

1 #include <cstdio> 2 #include <iostream> 3 #include <vector> 4 #include <algorithm> 5 #include <cstring> 6 7 using namespace std; 8 9 const int maxn = 1010; 10 int pos[maxn]; 11 int snode[maxn]; 12 int die[maxn]; 13 int win[maxn]; 14 int n; 15 16 vector<int>vec[maxn]; 17 18 void init() 19 { 20 memset(pos,0,sizeof(pos)); 21 memset(snode,0,sizeof(snode)); 22 memset(die,0,sizeof(die)); 23 memset(win,0,sizeof(win)); 24 25 char ps; 26 int pre; 27 for(int i=1;i<=n;i++) { 28 vec[i].clear(); 29 } 30 31 for(int i=1;i<=n;i++) { 32 scanf("%d %c%*c",&pre,&ps); 33 if(pre==-1) continue; 34 vec[pre].push_back(i); 35 if(ps=='Y') pos[i] = 1; 36 } 37 } 38 39 int cmp(int a,int b) { 40 return (die[a]+2)*snode[b]<(die[b]+2)*snode[a]; 41 } 42 43 void dfs(int x) { 44 int len = vec[x].size(); 45 for(int i=0;i<len;i++) 46 dfs(vec[x][i]); 47 if(len ==0) 48 { 49 snode[x] = 1; 50 die[x] = 0; 51 win[x] = 0; 52 return; 53 } 54 for(int i=0;i<len;i++) { 55 snode[x] +=snode[vec[x][i]]; 56 if(pos[x]==0) die[x] +=die[vec[x][i]] + 2; 57 } 58 59 int tmp[10]; 60 for(int i=0;i<len;i++) { 61 tmp[i] = vec[x][i]; 62 } 63 64 int sum = 0; 65 sort(tmp,tmp+len,cmp); 66 for(int i=0;i<len;i++) { 67 win[x] +=(sum+1)*snode[tmp[i]] + win[tmp[i]]; 68 sum +=die[tmp[i]]+2; 69 } 70 71 } 72 73 int main() 74 { 75 while(scanf("%d%*c",&n),n) { 76 init(); 77 double ans; 78 dfs(1); 79 ans = 1.0*win[1]/snode[1]; 80 printf("%.4lf\n",ans); 81 } 82 return 0; 83 } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/TreeDream/p/6537632.html

總結(jié)

以上是生活随笔為你收集整理的poj 2057 树形DP,数学期望的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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