hdu4921 map(狀壓統計)
解法:很直觀的一點,期望值=所有情況的權值和/所有的情況數。情況數很好算,所有的鏈長+1求乘積即可(要減去什麼都不選的一種情況)。而所有的情況的權值和,我們這樣算:因為同一層之間的點,選的個數會對該層產生乙個影響,所以我們一層一層考慮。總共只有10條鏈,故考慮任何一層上的點,選或者不選的狀態只有2^10種,那麼我們列舉這2^10個狀態,對於某乙個狀態,我們可以暴力算出能得到的點權和以及附加值,但是對於這個狀態,它會出現在很多種選擇情況當中。比如我們有兩條鏈,鏈長都是3,當前考慮的是第二層的10狀態(二進位制1表示選,0表示不選),那麼,當鍊1分別取前2個,前3個,鏈2分別取前0個,前1個。這四種都會包含第二層10的狀態,因此,這個狀態會在4種選擇情況中貢獻給權值總和,故而要將求出的點權和+附加值乘上情況數再累加到權值總和當中,每一層都考慮完了之後,問題得解。
**:
#include#include#include#includeusing namespace std ;
int son[11111] ;
int chain[10][1111] , a[11111] ;
int vis[11111] , du[11111] , len[11] ;
double dfs ( int u , int step , int c )
int main ()
double sum = 1 , ans = 0 ;
int tot = 0 ;
for ( int i = 0 ; i < n ; i ++ )
}sum -= 1 ;
// printf ( "sum = %f\n" , sum ) ;
for ( int i = 0 ; i < 1000 ; i ++ )
}printf ( "%.3f\n" , ans / sum ) ;
}return 0 ;
}
HDU 4909 String 統計 狀壓
因為連續異或滿足區間減法性質,所以可以狀壓之後用異或來判斷是否為符合條件的單詞並且儲存次數 一開始用map,一直超時。雖然直接用開1 26的陣列記憶體存的下,但是memset的時間肯定會超,但是只要在每次迴圈之後把加過的值減掉就可以繞過memset了。include include include ...
hdu 4770 狀壓 列舉
長記性了,以後對大陣列初始化要注意了!140ms 原來是對vis陣列進行每次初始化,每次初始化要200 200的複雜度 一直超時,發現沒必要這樣,直接標記點就行了,只需要乙個15的陣列用來標記,vis陣列用來對映座標就行了 然後就是暴力加了一點優化,下面沒有加優化。include include d...
HDU2489 狀壓列舉
題意 給你n個點的圖,然後讓你在圖里挑m個點,達到sumedge sumnode最小 思路 由於資料範圍小,狀壓列舉符合m個點的狀態,我是用vactor存了結點位置,也記錄了結點的sum值,然後跑一發最小生成樹就可以知道sumedge,這裡判斷可以利用乘法,然後更新乙個狀態就好了 include u...