1. 程式人生 > >NOIP2016——換教室(floyd+期望dp)

NOIP2016——換教室(floyd+期望dp)

描述 對於剛上大學的牛牛來說, 他面臨的第一個問題是如何根據實際情況中情合適的課程。 在可以選擇的課程中,有2n節課程安排在n個時間段上。在第 i ( 1≤ i≤n)個時同段上, 兩節內容相同的課程同時在不同的地點進行, 其中, 牛牛預先被安排在教室 ci上課, 而另一節課程在教室 di進行。 在不提交任何申請的情況下,學生們需要按時間段的順序依次完成所有的n節安排好的課程。如果學生想更換第i節課程的教室,則需要提出中情。若申請通過,學生就可以在第 i個時間段去教室 di上課, 否則仍然在教室 ci上課。 由於更換教室的需求太多, 申請不一定能獲得通過。 通過計算, 牛牛發現申請更換第 i節課程的教室時, 中情被通過的概率是一個已知的實數 ki, 並且對於不同課程的申請, 被通過的概率是互相獨立的。 學校規定, 所有的申請只能在學期開始前一次性提交, 並且每個人只能選擇至多m節課程進行申請。 這意味著牛牛必須一次性決定是否申請更換每節課的教室, 而不能根據某些課程的申請結果來決定其他課程是否申請; 牛牛可以申請白己最希望更換教室的 m門課程,也可以不用完這m箇中情的機會,甚至可以一門課程都不申請。 因為不同的課程可能會被安排在不同的教室進行, 所以牛牛需要利用課問時間從一間教室趕到另一間教室。 牛牛所在的大學有 v個教室,有 e條道路。每條道路連線兩間教室, 並且是可以雙向通行的。 由於道路的長度和擁;i者程度不同, 通過不同的道路耗費的體力可能會有所不同。當第i ( 1≤i≤n-1 )節課結束後,牛牛就會從這節課的教室出發,選擇一條耗費體力最少的路徑前往下一節課的教室。 現在牛牛想知道,申請哪幾門課程可以使他因在教室問移動耗費的體力值的總和的期望值最小,請你幫他求出這個最小值。 輸入格式:

第一行四個整數 n,m,v,e 。 n表示這個學期內的時間段的數量; m表示牛牛最多可以申請更換多少節課程的教室; v表示牛牛學校裡教室的數量; e表示牛牛的學校裡道路的數量。 第二行n個正整數,第 i ( 1≤ i≤ n)個正整數表示c,即第 i個時間段牛牛被安排上課的教室;保證1≤ ci≤ v。 第三行n個正整數,第 i ( 1≤ i≤ n)個正整數表示di,即第 i個時間段另一間上同樣課程的教室;保證1≤ di≤ v。 第四行n個實數,第 i ( 1≤ i≤ n)個實數表示ki,即牛牛申請在第 i個時間段更換教室獲得通過的概率。保證0≤ ki≤1 。 接下來 e行,每行三個正整數aj,bj,wj,表示有一條雙向道路連線教室 aj ,bj ,通過這條道路需要耗費的體力值是 Wj ;保證1≤ aj,bj≤ v, 1≤ wj≤100 。 保證1≤n≤2000, 0≤m≤2000, 1≤v≤300, 0≤ e≤90000。 保證通過學校裡的道路,從任何一間教室出發,都能到達其他所有的教室。 保證輸入的實數最多包含3位小數。 輸出格式
: 輸出一行,包含一個實數,四舎五入精確到小數點後恰好2位,表示答案。你的 輸出必須和標準輸出完全一樣才算正確。 測試資料保證四舎五入後的答案和準確答案的差的絕對值不大於4 *10^-3 。 (如果你不知道什麼是浮點誤差, 這段話可以理解為: 對於大多數的演算法, 你可以正常地使用浮點數型別而不用對它進行特殊的處理)

我覺得這道題比T2天天愛跑步還要簡單很多啊

T2只去打暴力就夠了,這道題隨便A嘛

因為教室的數量只有300,所以我們直接用floyd求出兩兩教師之間的距離

如果再多點就只能SPFA了,

首先有n個課,可以申請m次,那麼肯定dp[i][j]dp[i][j]表示前i個申請j次的最優值

考慮到每個課程可以選擇申請或者不申請,再加一維0/1表示這一次是否申請(不一定要申請成功)

那麼對於第ii門課程成功的概率就為p[i]p[i],不成功的概率就為(1p[i])(1-p[i])

首先我們考慮不申請的情況

那麼我們考慮第i1i-1節課

有申請和不申請兩種情況

不申請則是

dp[i][j][0]=dp[i1][j][0]+dis[c[i1]][c[i]]dp[i][j][0]=dp[i-1][j][0]+dis[c[i-1]][c[i]] (c[i],d[i]c[i],d[i]的定義如原題)

如果申請了,則還要考慮成功和不成功兩種情況的貢獻分別乘上各自的概率

為: dp[i][j][0]=dp[i1][j][1]+dis[c[i1]][c[i]](1p[i1])+dis[d[i1]][c[i]]p[i]dp[i][j][0]=dp[i-1][j][1]+dis[c[i-1]][c[i]]*(1-p[i-1])+dis[d[i-1]][c[i]]*p[i]

所以綜合起來不申請的情況就是

dp[i][j][0]=min(dp[i][j][0],min(dp[i1][j][0]+dis[c[i1]][c[i]],dp[i1][j][1]+dis[c[i1]][c[i]](1p[i1])+dis[d[i1]][c[i]]p[i1])dp[i][j][0]=min(dp[i][j][0],min(dp[i-1][j][0]+dis[c[i-1]][c[i]],dp[i-1][j][1]+dis[c[i-1]][c[i]]*(1-p[i-1])+dis[d[i-1]][c[i]]*p[i-1])

那麼我們再來考慮申請的情況:

這裡又要分為前面一門課程申請了和沒申請兩種情況

如果沒申請

那麼自己就要分為成功和不成功兩種:

dp[i][j][1]=dp[i1][j1][0]+dis[c[i1]][d[i]]p[i]+dis[c[i1]][c[i]](1p[i])dp[i][j][1]=dp[i-1][j-1][0]+dis[c[i-1]][d[i]]*p[i]+dis[c[i-1]][c[i]]*(1-p[i])

而如果申請了的話就要考慮四種可能情況的貢獻:

前一個成功,這一個也成功:

dis[d[i1]][d[i]]p[i1]p[i]dis[d[i-1]][d[i]]*p[i-1]*p[i]

前一個成功,這一個未成功:

dis[d[i1]][c[i]]p[i1](1p[i]))dis[d[i-1]][c[i]]*p[i-1]*(1-p[i]))

前一個未成功,這一個成功:

dis[c[i1]][d[i]](1p[i1])p[i]dis[c[i-1]][d[i]]*(1-p[i-1])*p[i]

前一個未成功,這一個也未成功;

dis[c[i1]][c[i]](1p[i1])(1p[i])dis[c[i-1]][c[i]]*(1-p[i-1])*(1-p[i])

所以申請的情況綜合起來就是

dp[i][j][1]=min(dp[i][j][1],min(dp[i1][j1][0]+dis[c[i1]][d[i]]p[i]+dis[c[i1]][c[i]](1p[i]),dp[i1][j1][1]+dis[d[i1]][d[i]]p[i1]p[i]+dis[c[i1]][d[i]](1p[i1])p[i]+dis[c[i1]][c[i]](1p[i1])(1p[i])+dis[d[i1]][c[i]]p[i1](1p[i])))dp[i][j][1]=min(dp[i][j][1],min(dp[i-1][j-1][0]+dis[c[i-1]][d[i]]*p[i]+dis[c[i-1]][c[i]]*(1-p[i]),dp[i-1][j-1][1]+dis[d[i-1]][d[i]]*p[i-1]*p[i]+dis[c[i-1]][d[i]]*(1-p[i-1])*p[i]+dis[c[i-1]][c[i]]*(1-p[i-1])*(1-p[i])+dis[d[i-1]][c[i]]*p[i-1]*(1-p[i])))

當然這必須要在j>0j>0的時候才行

所以說綜合起來的遞推方程就是

dp[i][j][0]=min(dp[i][j][0],min(dp[i1][j][0]+dis[c[i1]][c[i]],dp[i1][j][1]+dis[c[i1]][c[i]](1p[i1])+dis[d[i1]][c[i]]p[i1]));dp[i][j][0]=min(dp[i][j][0],min(dp[i-1][j][0]+dis[c[i-1]][c[i]],dp[i-1][j][1]+dis[c[i-1]][c[i]]*(1-p[i-1])+dis[d[i-1]][c[i]]*p[i-1]));

dp[i][j][1]=min(dp[i][j][1],min(dp[i1][j1][0]+dis[c[i1]][d[i]]p[i]+dis[c[i1]][c[i]](1p[i]),dp[i1][j1][1]+dis[d[i1]][d[i]]p[i1]p[i]+dis[c[i1]][d[i]](1p[i1])p[i]+dis[c[i1]][c[i]](1p[i1])(1p[i])+dis[d[i1]][c[i]]p[i1](1p[i])));dp[i][j][1]=min(dp[i][j][1],min(dp[i-1][j-1][0]+dis[c[i-1]][d[i]]*p[i]+dis[c[i-1]][c[i]]*(1-p[i]),dp[i-1][j-1][1]+dis[d[i-1]][d[i]]*p[i-1]*p[i]+dis[c[i-1]][d[i]]*(1-p[i-1])*p[i]+dis[c[i-1]][c[i]]*(1-p[i-1])*(1-p[i])+dis[d[i-1]][c[i]]*p[i-1]*(1-p[i])));(if(j>=1))(if(j>=1))

這真的有點長啊,但其實理解之後就很簡單了

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	char ch=getchar();
	int res=0;
	while(!isdigit(ch)) ch=getchar();
	while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48),ch=getchar(
            
           

相關推薦

NOIP2016——教室floyd+期望dp

描述 對於剛上大學的牛牛來說, 他面臨的第一個問題是如何根據實際情況中情合適的課程。 在可以選擇的課程中,有2n節課程安排在n個時間段上。在第 i ( 1≤ i≤n)個時同段上, 兩節內容相同的課程同時在不同的地點進行, 其中, 牛牛預先被安排在教室 ci上課

[NOIP2016]教室概率期望$DP$

span 就是 return print 結果 其中 完成 可能 連通圖 其實吧我老早就把這題切了……因為說實話,這道題確實不難啊……李雲龍:比他娘的狀壓DP簡單多了 今天我翻以前在Luogu上寫的題解時,突然發現放錯代碼了,然後被一堆人\(hack\)……藍瘦啊\(ORZ

Noip2016 教室數學期望入門

min 小數 輸出 return 入門題 clas ont 數學期望 std 題意:有2n個課程安排在n個時間段上,在第i個時間被安排在ci教室上課,但牛牛可以申請換教室,到di教室上課,但只有pi的可能成功。學校有v個教室,e條道路,每條路雙向連通,每條路都會消耗一定的體

noip2016教室期望dp)

整體思路: 這節課換了教室的期望路程 = min(上節課換了教室的期望路程 + 上節課教室到這節課教室的期望路程, 上節課沒換教室的期望路程+ 上節課教室到這節課教室的期望路程) 這節課沒換教室的期望路程 = min(上節課換了教室的期望路程  + 上節課教室到這節課教室的期望路程

藍書演算法競賽進階指南刷題記錄——CH3802 綠豆蛙的歸宿DAG期望DP

題目:CH3802. 題目大意:給定一張有向無環圖,一直蛙要從點1走到點n,它每次會等概率從一個點經過一條出邊走到下一個點,求從點1走到點n的期望路徑長度. 我們很容易看出這是一個期望DP. 那麼我們設狀態f[i]為從點1到點i時的期望路徑長度. 但是我們發現狀態轉移方程就十分不

Wannafly挑戰賽23-C-收益概率+期望DP

題目描述 小N是一家金融公司的專案經理。他準備投資一個專案,這個專案要融資L元,融資成功後會得到M元的利潤。現在有n個客戶。對於第i個客戶,他有mi元錢。小N承諾假如最後籌夠錢,會給這名客戶mi x ri的分紅。小L通過迷之手段,估計出這個客戶最後願意出錢的概率為pi。

牛客練習賽31 C 無畏死靈術士莉蓮娜與鎖鏈面紗dfs + 期望dp

    太久沒有做期望/概率dp,已鏽。。。 大概就是說給你一個1到n的全排列,然後每次隨機選擇一個數字在不改變其他數字相對位置的前提下,把比他小的數字放在他前面,大的在後面。問期望幾次能夠使得這個序列有序。 由於是求期望,所以顯然是要倒著求。令d

[BZOJ4008][HNOI2015]亞瑟王概率期望dp

題目描述 傳送門 題解 感覺這題挺神的,我想了好久 首先需要明確的是打牌的先後順序是無所謂的,比如我四輪打了第1324張把它看做打了第1234張一樣做 令f(i,j)表示1..i-1張牌已經打

JZYZOJ1457 [NOIP2016]教室 期望dp 動態規劃 floyd算法 最短路

期望 none play math spa string cnblogs ring esp http://172.20.6.3/Problem_Show.asp?id=1457 我不知道為什麽我倒著推期望只有80分,所以我妥協了,我對著題解寫了個正的,我有罪。 1 #

NOIP2016」「P1850」 教室期望dp

題目描述 對於剛上大學的牛牛來說,他面臨的第一個問題是如何根據實際情況申請合適的課程。 在可以選擇的課程中,有 2n2n 節課程安排在 nn 個時間段上。在第 ii(1 \leq i \leq n1≤i≤n)個時間段上,兩節內容相同的課程同時在不同的地點進

【bzoj4720】[Noip2016]教室 期望dp+最短路

\n 課程 情況 memset 輸入 main 好的 can 結果 Description 對於剛上大學的牛牛來說,他面臨的第一個問題是如何根據實際情況申請合適的課程。在可以選擇的課程中,有2n節 課程安排在n個時間段上。在第i(1≤i≤n)個時間段上,兩節內容相同的課程同

bzoj 4720: [Noip2016]教室期望dp

zoj can 期望dp getchar [1] using main urn || 狀壓dp,設f[i][j][0/1]為前i個時間段換了j間教室的期望體力消耗,轉移很好想(但是寫起來好長= =) #include<iostream> #include<

[BZOJ1419] Red is good期望DP

-1 cst com log ret brush 期望 class www. 傳送門 逆推 只不過順序還是順著的,思想是逆著的 f[i][j]表示還剩下i張紅牌,j張黑牌的期望值 那麽邊界是 f[i][0]=i,因為只剩i張紅牌 f[0][j]=0,只剩黑

[Bzoj4832][Lydsy2017年4月月賽]抵制克蘇恩 期望dp

rip namespace set solved discus 題意 職業 using 什麽 4832: [Lydsy2017年4月月賽]抵制克蘇恩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 673

BZOJ1076獎勵關狀壓期望dp

fsg bzoj1076 get ctx oda x86 store vbo shu jzp訊廄62跋hx6http://t.docin.com/sina_6341946983 V順撞濁z衫X詵徽2撈4http://jz.docin.com/dtfv76012 a0

ZOJ 3329 Problem Set 期望dp

logs name multipl center pla inter follow there ati One Person Game There is a very simple and interesting one-person game. You have

【題解】 bzoj3036: 綠豆蛙的歸宿 期望dp

www. cpp can bit push oid rom .cn 概率 題面戳我 Solution 反向建圖跑拓撲排序,順便處理\(dp\) 假設某條邊是\(u \rightarrow v (dis)\) ,那麽轉移方程就是\(dp[v]+=(dp[u]+dis)/in

【題解】 bzoj1076: [SCOI2008]獎勵關 裝壓+期望dp

狀態 span 方程 con can i+1 std tin log 題面戳我 Solution 並不會做,看了下題解大概了解了。期望這個東西好難搞啊qwq 我們定義\(dp[i][j]\)表示第\(i\)步,拿到寶物前的狀態為\(j\)。 正著來會有很多不合法的情況,剔

P3750 [六省聯考2017]分手是祝願期望+DP

nbsp name space 現在 處理 math ans tor getc 題解 很容易想出來最優策略是什麽。 就是從n到1看到開著的燈就把它關了 我們預處理出當前狀態把燈全部關閉後的最少步數cnt 然後我們的主人公就要瞎按。。。 設dp[i]代表當前狀態最優解為

bzoj4481非誠勿擾期望dp

open 子集 pri mes names 技術分享 namespace 概率 col 有n個女性和n個男性。每個女性的如意郎君列表都是所有男性的一個子集,並且可能為空。如果列表非空,她們會在其中選擇一個男性作為自己最終接受的對象。將“如意郎君列表”中的男性按照編號從小到大