1.做這個題目之前,首先可以做一下綠豆蛙的歸宿 這道題目。二者幾乎一樣。其實二者的核心思想都是倒著推期望,為什麼會倒著推?其實也有很多種解釋,有句話說得很好,其實就是詮釋了為什麼期望要倒著dp。終點是概率的結束,是期望的開始。
2.綠豆蛙的歸宿:
解釋一下就是當前節點的值由所有和它相連的節點的值貢獻而來,貢獻值等於這個節點本來具有的值和他們之間的邊權之和再乘一下貢獻的權重就是答案。寫法也很簡單,因為是倒著dp,所以把圖反著建一下然後一邊topsort,一邊dp。
#includeusing namespace std;
const int maxn = 2e5 + 10;
int head[maxn], tot;
struct eedge[maxn << 1];
inline void add(int x, int y, int v)
int deg[maxn], out[maxn];
double dp[maxn];//dp[i]代表從i點走到n點花費的期望
using namespace std;
queueq;
int main()
q.push(n);
while (q.size())
} printf("%.2lf\n", dp[1]);
}
(3)然後是robots。依然是乙個dag,開始機械人在1點,然後每次都會等概率的停在原地或者走向和它連線的下乙個點。每次走的花費是當前點已經花費的天數,問走到n的期望花費。還是求期望,首先是求一下天數的期望。dp[x]代表從x走到n的期望天數。和剛才幾乎是一樣的。
化簡一下:
有了天數,就是有了費用,然後再dp一遍,dpe[x]代表從x走到n的費用的期望:
化簡一下
然後這個題就寫完了,可以直接和剛才一樣,反著建圖,一邊topsort一邊dp,但是為了好理解,記憶化搜尋一下也不錯。
#includeusing namespace std;
const int n = 2e5 + 10;
vectormp[n];
double dpd[n], dpe[n];//dpd表示天數的期望,dpe表示花費的期望
int out[n];
void init()
// dpd[u]=sigma(dpd[v])/out[u]+1+1/out[u]
double dfsd(int u)
dpd[u] = sum /out[u]*1.0 + 1 + 1.0/ out[u];
return dpd[u];
}// dpe[u]=sigma(dpe[v])/out[u]+(out[u]+1)/out[u]*dp[u]
double dfse(int u)
dpe[u] = sum/ out[u]*1.0 + (out[u] + 1)*1.0/out[u]*1.0 * dpd[u];
return dpe[u];
}int main()
dfsd(1);
dfse(1);
printf("%.2lf\n", dpe[1]);
} return 0;
}
2019 南京網路賽 B F H
其實這場我爆零了,都是隊友a的題,現在滾過來補題了。可補題 a先欠著 這個題運用了擴充套件尤拉降冪 於是我o n 的去求每一層的底數和冪數?成功超時。然後搜題解 waht?類似減了一下枝就可以了?當時隊友告訴我用什麼快速冪套快速冪?這種題可以快速冪套快速冪?成功被隊友帶歪,怎麼說呢,自己也菜,隊友也...
2019南京網路賽 B robots
給乙個 dag dagda g,乙個機械人從 1 11 走到 n nn 每一步會等概率走向某乙個後繼或不動,每一步 包括不動 的花費是當前的步數。求從起點走到終點的期望花費期望。期望 dp。f u f u f u 表示從 u uu 出發的期望步數,g u g u g u 表示從 u uu 出發的期望...
Holy Grail 2019南京網路賽
給定乙個有向無負環圖,然後告訴你要依次加6條邊,要保證每次加邊後無負環,求依次加邊時保證當前邊最小。由於題目保證有解,所以s t的邊時一定有t到s的通路,我們找到t到s的最短路,那麼久可以知道s t這條新加邊的最小值 include define maxl 510 using namespace s...