「圧力DPのような」シンプル期待

問題の意味

 

 

問題の解決策

DP神の真の定義は、

高いからの暴力がない場合のアイデアは、最初の$のx $操作、$ MAXN $、$ MAXN $ 1の状態<< 200のための[X] [MAXN] $ F $を向けることです

実際に、我々は、F $を定義することができる[X] [MAXN] [LEN] [0 \ 1] $ MAXN $ $後8、後第0 \ 1、第確率の$ $ Jの連続した長さ

なぜ、この定義

実際には数2の素因数分解は、バック0の数であります

0 +1は、すべて1 8が十分なされた後動作し、最大200までの既存の番号を破壊します

それだけで最初の9の後に影響します

極端なケースを考えてみましょう

111111111111111

今運ぶでしょう、最後の1に追加

1000000000000000、そして+1はもはや後9に影響を与えないだろうか

 

 

コードでは比較的簡単な具体的な外観を転送

コード

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  の#defineっ長い長い
 4  LLのX、N、M、XX、選ぶ、MAXN、CNT。
5  ダブル P、ANS = 0 6  二重 F [ 210 ] [ 288 ] [ 310 ] [ 2 ]。
7  LL CAL(LL今){
 8      のLL CNT = 0 9      ながら(現在%2 == 0)CNT ++、今/ = 2 10      リターンCNT;
11  }
 12 INT メイン(){
 13  //     freopenは( "cnm.xlsx"、 "W"、STDOUT)。
14      のscanf(" %LLD%LLD%LF "、&​​X、およびnは、&P)。
15      P / = 100 16      のXX =のX。
17      XX >> = 8 18      OPT = XX&1 19      MAXN =(1 << 8) - 1 20      のために(; XX &&((XX&1)== OPT); XX >> = 1 21          CNT ++      0)CNT ++; //
 23      M = CNT + N。
24      F [ 0 ] [X&MAXN] [CNT]が[OPT] = 1 25  //     のprintf( "%LLDする\ n"、M)。
26      のために(LL i = 1 ; iが<= N iが++ 27          のための(LL =事前0 ; <= MAXN事前; ++予備28              のための(LL J = 1 ; J <= Mであり、j ++ 29                  のための(LL T = 0 ; T <= 1 ; T ++ 30                  であれば(F [I- 1 ] [事前] [J] [T]){        
 31                     LL今、TT、JJ。
32                      今=プリ+ 1 33                      であれば(今==(1 << 8 )){
 34                          今や= 0 ; TT = T ^ 1 35                          であれば(Tの== 1)JJ = J。
36                           JJ = 1 37                      }
 38                       JJ = J、TT = T。
39                      F [i]は[今] [JJ] [TT] + = F [I- 1 ] [事前] [J] [T] *(1 - P)。
40                     今=前<< 1 41                      であれば(((今>> 8)&1)== T)TT = T、JJ = J + 1 42                      他の TT = T ^ 1、JJ = 1 ;
43                      今=今&MAXN。
44                      F [i]は[今] [JJ] [TT] + = F [I- 1 ] [事前] [J] [T] * P。
45                  }
 46      (LL今= 1 ;今<= MAXN;今++)//
 47          (LLのJ = 1 ; J <= Mであり、j ++ 48              のための(LL T =0 ; T <= 1 ; T ++ 49                  であれば(F [N] [今] [J] [T])
 50の                  ANS + = F [N] [今] [J] [T] * CAL(今)。
51                  // 、のprintf( "F [%LLD] [%LLD] [%のLLD] [%LLD] =%LF \ n"は、N、今、J、T、F [N] [今] [J] [ T])。
52  //     のprintf( "%13lfを\ n"、ANS)。
53      のための(LLのJ = 1 ; J <= Mであり、j ++ ){
 54の          ANSは+ = F [N] [ 0 ] [j] [ 0 ] *(J + 8)+ F [N]が[ 0 ] [j]を[ 1 ] * 8 55  //        printf( "F [%のLLD] [0] [%のLLD] [0] =%LF F [%のLLD] [0] [%のLLD] [1] =%LF N \"、N、J、N [F ] [0] [j] [0]、N、J、F [N] [0] [j]を[1])。
56      }
 57      のprintf(" %.13lfする\ n " 、ANS)。
58 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/znsbc-13/p/11719901.html