ランダム化フィボナッチ(HihoCoder-1164)DPを所望しました

フィボナッチ数列を「ランダム化された」新しいを生成するには、以下の方法を考えてみましょう。

A0 = 1、愛= AJ + AK、I> 0、jおよびkは、(j及びkは独立している)、[0、I-1]の区間内の全ての整数からランダムに選択されます。

今与えられたN、長さの最終的な配列の全てposibilitiesのうち、n、の期待は何ですか?

入力

整数nの一行。

出力

解答を表す浮動小数点数と一行。それは少ない10-6より標準答えることである相対的または絶対的なエラーが発生した場合の答えは正しいとみなされます。

サンプル入力

2

サンプル出力

3.000000

質問の意味:私はあなたがフィボナッチ列に精通していると信じて:A0 = 1、A1 = 1 =、愛愛-1 + AI-2、(I> 1)。A0 = 1、= AJ愛:今列を生成したフィボナッチ数を考慮し 、+ AKをI> 0の整数、JからK [0、I-1](独立JおよびK)をランダムに選択しました。今与えられたN、E期待値に可能なの()、即ち、一連を得るために必要。
思考:[I] = [ J] + [K]、J およびkは独立変数です(変化量は、従属変数を除く他の変化量は発生しません)、j、kが、[0を取ることができますI-1] jとkの和と種々の値のいずれかで、iは、(所望の)で除算した後の平均値です。

ACコード:

#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <iomanip>
const int maxx=1010;
const int inf=0x3f3f3f3f;
using namespace std;
double a[maxx];
int main()
{
    int n;
    cin>>n;
    memset(a,0,sizeof(a));
    a[0]=1;
    a[1]=2;
    for(int i=2;i<=500;i++)
    {
        double sum=0;
        for(int j=0;j<i;j++)
        {
            sum+=2*a[j];
        }
        a[i]=sum/i;
    }
    cout<<fixed<<setprecision(6)<<a[n]<<endl;
    return 0;
}

 

公開された212元の記事 ウォン称賛18 ビュー20000 +

おすすめ

転載: blog.csdn.net/weixin_43846139/article/details/104068243