ボンドI

タイトル

成形圧力DP

セットF [i]はiが状態の最大確率を表します

だから、明らかに移し、F

私たちは、私たちは、J、Kを私を列挙しなければならない場合でも、時間は揚げされます

だから、最適化する方法を探して

注意深い観察、あなたはkはそれに対処できることがわかります

[i]が二つのアレイ、CNT [i]は、ログを配置

[i]は、I 2のいくつかのべき乗で表されるログ(切り捨て)

私はCNT場合[i]がkの状態

転送のログを記録

 

CNT転送

 

その後、転送がfに変更することができます

 

 

書式#include <cstdioを> 
する#include <iostreamの> 
の#include <CStringの>
 使用して 名前空間はstd;
ダブル F [ 2097151 ]。
INT [ 30 ] [ 30 ]、ログイン[ 2097151 ]、N、CNT [ 2097151 ]。
INT メイン()
{ 
    scanf関数(" %のD "、&N)
    以下のためにint型 i = 1 ; iは= N <I ++ のためのINT J = 1 ; J <= N; J ++ 
            のscanf("%のD 、および[I] [J]); 
    [ログ0 ] = - 1 ;
     のためにINTは I = 1 ; iが(< 1 << N)、iは++ 
        ログ[i]は =ログイン[I / 2 ] + 1 
    CNT [ 0 ] = 0 ;
     のためint型 i = 1 ; iが(< 1 << n)は、iが++ 
        CNT [I] = CNT [1-(1 << [I]ログ)] + 1 
    F [ 0 ] = 1 ;
     のためにint型 i = 0 ; iが(< 1 << N); I ++ のためのINT J = 1 ; J <= N; J ++ 場合((I&(1 <<(J- 1)))== 0 
                F [I |(1 << J- 1)] = MAX(F [I |(1 << J- 1)]、F [I] * [J] [CNT [I] + 1 ] * 1.0 / 100 ); 
    printf(" %の.6lfする\ n "、F [(1個の << N) - 1 ] * 100 )。
}

 

おすすめ

転載: www.cnblogs.com/nibabadeboke/p/11332833.html