成形圧力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 )。 }