1. 程式人生 > >BNUOJ 34978 漢諾塔 (概率dp)

BNUOJ 34978 漢諾塔 (概率dp)

pre lin for ron 2.0 pla return popu while

題目分析:對於 i 個盤 , 須要移動多少步,取決於最大的盤子在哪個桿上。在C桿上,則最大的盤不須要移動,由於初始狀態一定是滿足盤由下到上盤子依次變小的,僅僅須要移動i - 1個盤。假設在A桿上,則首先須要將最大盤移到C桿上。在此之前當然須要將其它i - 1個盤都移到B上,然後,將最大的盤移動到C上。然後移動i - 1個在B上的盤。假設最大的盤在B桿上,則相似於在A桿上的情況。

假設x個盤都在1個桿上 , 要移動到另外一個桿上,須要pow(2 。 x) - 1步。

設dp[ i ] ?為要移動 i 個盤子的期望步數。顯然 dp[ 1 ] = 2/3 = 1/3 * 0 ?+ 1/3 ?* 1 + 1/3 * 1;

由上面的分析可知。dp[ i ] = 1/3 * dp[ i - 1] + 1/3 * (dp[ i - 1] + 1 + pow(2 , i - 1) - 1) ?+?1/3 * (dp[ i - 1] + 1 + pow(2 , i - 1) - 1)?

??=?1/3 * dp[ i - 1] +2/3 * (dp[ i - 1] + pow(2 , i - 1) )

AC_CODE

const int Max_N = 32;
double dp[Max_N];

int main()
{
    int t , n;
    cin >> t;
    while(t--){
        cin >> n;
        dp[1] = 2.0/3;
        for(int i = 2; i <= n;i++){
            dp[i] = 1.0/3 * dp[i -1] + 2.0/3 *(dp[i - 1] + pow(2.0 , i - 1));
        }
        printf("%.2lf\n",dp[n]);
    }
    return 0;
}


BNUOJ 34978 漢諾塔 (概率dp)