収集バグPOJ - 2096(予想DP)

イワンは、収集のが好きです。ポスト切手、コインや他の材料のものを収集し、他の人とは違って、彼はソフトウェアのバグを収集します。イワンは、新しいプログラムを取得すると、彼はn個のカテゴリにすべての可能なバグを分類します。毎日、彼はプログラムの中で正確に一つのバグを発見し、スプレッドシートにそれとそのカテゴリに関する情報を追加します。彼はすべてのバグのカテゴリでバグを見つけたとき、彼はプログラムが嫌呼び出して、自分のホームページで、このスプレッドシートを発行し、そしてプログラムについて完全に忘れてしまいます。
両社は、MacrosoftとMicrohardは厳しい競争関係にあります。Microhardは1つのMacrosoftプログラムの売上を減少させるために望んでいます。彼らは、問題のプログラムが嫌であることを証明するためにイワンを雇います。しかし、イワンは、複雑な問題を抱えています。この新しいプログラムは、Sサブコンポーネントを持っており、目標に到達することができる前に、各サブコンポーネントのすべてのタイプのバグを見つけることは時間がかかりすぎます。だから、イワンとMicrohardはシンプルな基準を使用することで合意 - イワンは、各サブシステムに少なくとも1つのバグや各カテゴリの少なくとも一つのバグを見つける必要があります。
Macrosoftは、これらの計画を知っているし、それはそのプログラム嫌を呼び出すためにイワンのために必要な時間を推定するために望んでいます。同社はすぐに新しいバージョンをリリースしているため、その計画を修正し、迅速にそれを解放することができますので、それは、重要です。誰も廃止されたバージョンの信頼性についてのイワンの意見に興味がないだろう。
プログラムで見つかったバグが等しい確率で任意のカテゴリのものとすることができます。同様に、バグが等しい確率で任意のサブシステムに見出すことができます。任意の特定のバグは、二つの異なるカテゴリに属しているまたは2つの異なるサブシステムで同時に発生することはできません。プログラムのバグの数はほとんど無限であるので、いくつかのサブシステムにはいくつかのカテゴリの新しいバグを発見する確率は、そのサブシステムで、そのカテゴリーのバグの任意の数を発見した後減少しません。
(の日数の平均時間検索プログラム嫌に名前を付けるために必要なイワンの仕事に)。
Aシステムにn個のサブシステムやバグメートルの種類、システムは、一日あたり(サブタイプとバグに属する)のバグになります、バグタイプが等しくありそうである、バグは、各サブシステム内の等しい確率で発生します。すべてのサブシステムは、日数を依頼すると予想し、バグのバグの種類のすべてが表示されます表示されています。
INPUT
INPUTファイル2つの整数の番号が含まれ、n型およびS(0 <N-、S <= 1 000)。
出力
出力は、ザ・イヴァンAPOS営業日への期待がに正確、コールザ・プログラム嫌に必要な4桁の小数点以下。
サンプルINPUT
2. 1
サンプル出力
3.0000

それは夏書かれた質問ですが、私が書くことはできませんが。

アイデア:
i番目のシステムのバグのために定義さdp [i] [j]は、Jタイプのバグが発生し、バグのすべてのタイプのバグのためにすべてのシステムのための日の所望の数が発生します。
次いで、[n]は[M] = DP 0。

サブ状態は次のとおりです。

  1. 1は、確率1で一日過ごし表します。
  2. DP [i]は、はい、それは自分の[J]です!I / N * J / mに対して、その確率P1を検討することが望ましいDpは
  3. DP [I + 1] [j]は、システムがより多くのバグがあり、P2は、確率(1 - I / N)* J / m
  4. DP [I]、[J + 1]、バグの複数のタイプ、I / N *の確率P3(1 - J / M)
  5. DP [I + 1] [J + 1]、バグに複数のシステム、多バグのタイプのP4確率(1 - I / N)*(1 - J / M)。

結果は
、DP [I] [J] = 1 + P1 * DP [I] [J] + P2 * DP [I + 1] [J] + P3 * DP [I]、[J + 1] + P4 * DP [ I + 1] [J + 1 ]。
注左へのシフトに"彼らの"私たち"自身"キーは、getへの回答があると
DP [I] [J] = (1つの+ P2 * DP [I + 1] [J] + P3 * DP [ I]、[J + 1] + P4 * DP [I + 1] [J + 1])/(1 - P1)

注目すべき点は次のとおりです。状態は我々はDP逆転しなければならない原因となる、数日間予想、目標状態への状態(i、j)のように定義されてなぜですか?

なぜDPとして定義されていない[I] [j]は、結果は、DP [n]は[M]であり、ターゲットの状態(i、j)の日数です。

仮定に係る方法を定義分析を、冷却し、次いで場合、P1 = 1 [n]は[M]が表示されるDPに進みます。そして、除数が0になります!それが限界となっています。したがって、このような状況では効果的にDPに回避することができる逆

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

double dp[1005][1005];

int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        dp[n][m] = 0;
        for(int i = n;i >= 0;i--)
        {
            for(int j = m;j >= 0;j--)
            {
                if(i == n && j == m)continue;
                double ii = (double)i,jj = (double)j,nn = (double)n,mm = (double)m;
                double p1 = (double)(ii / nn) * (jj / mm);
                double p2 = (double)(ii / nn) * (1.0 - jj / mm);
                double p3 = (double)(1.0 - ii / nn) * (jj / mm);
                double p4 = (double)(1.0 - ii / nn) * (1.0 - jj / mm);
                dp[i][j] =  1.0 + p2 * dp[i][j + 1] + p3 * dp[i + 1][j] + p4 * dp[i + 1][j + 1];
                dp[i][j] /= (1.0 - p1);
            }
        }
        printf("%.4f\n",dp[0][0]);
    }
    
    return 0;
}

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

おすすめ

転載: blog.csdn.net/tomjobs/article/details/104237093