NOIP2018模擬賽Potato 概率Dp 矩陣優化
阿新 • • 發佈:2018-11-06
NOIP2018模擬賽Potato
題目
分析
考慮動態規劃。
首先考慮到產生一個
級土豆的條件是有兩個
級的土豆。
由於每次都把土豆往左移,所以每次都是後面空出來一塊盒子讓你放。
於是可以Dp,先求當前一共有
個盒子,產生了一個
級土豆的概率。(接下來都假設有
個盒子)
考慮產生一個
級土豆,並且之後不再產生任何高於
級土豆的概率。
因為如果連一個
級土豆都沒有產生的話,一定不會有更高階的土豆出現。
在此基礎上,求最終第
個位置上是
級土豆,
內的所有土豆等級和的期望。
其中
表示的是加權平均,也就是
也就是考慮
個位置上最終為
級別的土豆的期望:先產生一個
級別的土豆,之後都不在產生
級別的土豆,在此基礎上乘上這個情況下之後所有土豆等級和的期望。
但是要特殊考慮一種情況,就是
,這種情況下
位置只能直接產生一個
級的土豆。
所以額外新建狀態,
表示最開始放了一個
級的土豆,合成了
的土豆的概率,
表示之後都不再產生高於
級別的土豆。轉移方程:
最終的答案是
轉移的複雜度是
的,只能通過
然而不難發現,土豆等級越高產生的概率應該是指數級別下降的。所以考慮捨去大於某個等級的土豆(標解捨去的是50級以上的土豆)
這樣的話,當
的時候
的轉移方程是一模一樣的,採用矩陣優化即可。
複雜度
程式碼
#include<bits/stdc++.h>
int ri() {
char c = getchar(); int x = 0, f = 1; for(;c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;
for(;c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) - '0' + c; return x * f;
}
double a[52][52], b[52][52], s[52][52], f[52][52];
struct Maxtir {
double m[52][52];
Maxtir() {memset(m, 0, sizeof(m));}
double *operator[](int i) {return m[i];}
Maxtir operator * (Maxtir b) {
Maxtir c;
for(int i = 1;i <= 51; +