跳转至

UVA10218 - Let's Dance !!!

keywords: 搜索

网上的题解很少,写一份

img

dp(递归)

/*
  Idea:
    - Dynamic Programming.
    - dp[men][rem]:
      `men` represents the number of the gentle men take candies till now.
      `rem` represents the number of remaining candies.
    - In each step calculate the probability of give the current candy
      to a gentle men or to a woman and sum the probabilities.
*/

#include <bits/stdc++.h>

using namespace std;

int m, w, c;
double dp[1010][100]; 

double rec(int mem, int rem)
{
    if (rem == 0){
        return mem % 2 == 0;
    }

    double &ret = dp[mem][rem];
    if (ret != -1) return ret;

    ret = 1.0*m/(m+w) * rec(mem+1, rem-1) + 1.0*w/(m+w) * rec(mem, rem-1);
    return ret;
}

int main()
{
    while (cin >> m >> w >> c){
        if (!m && !w) break;

        for (int i = 0; i <= c; i++)
            for (int j = 0; j <= c; j++) dp[i][j] = -1;

        printf("%0.7lf\n", rec(0, c));
    }

    return 0;
}

dp(循环)

#include <bits/stdc++.h>

using namespace std;

int m, w, c;
double dp[1010][100]; 

int main()
{
    while (cin >> m >> w >> c){
        if (!m && !w) break;

        for (int i = 0; i <= c; i++)
            for (int j = 0; j <= c; j++) dp[i][j] = -1;

        double p = 1.0 * m  / (m + w);
        dp[0][0] = 1.0, dp[0][1] = 0.0;  //[0]分到偶数,[1]分到奇数

        for (int i = 1; i <= c; i++){
            dp[i][0] = dp[i-1][0] * (1-p) + dp[i-1][1] * p;
            dp[i][1] = dp[i-1][1] * (1-p) + dp[i-1][0] * p;
        }

        printf("%0.7lf\n", dp[c][0]);
    }

    return 0;
}

组合数学

#include <bits/stdc++.h>

using namespace std;

typedef long double ll;

int m, w, c;
ll C[110][110];

void init()
{
    for (int i = 0; i <= 100; i++) C[i][0] = 1;
    for (int i = 0; i <= 100; i++) C[i][i] = 1;

    for (int i = 1; i <= 100; i++)
        for (int j = 1; j <= i; j++)
            C[i][j] = C[i-1][j-1] + C[i-1][j];
}

int main()
{
    init();

    while (cin >> m >> w >> c){
        if (!m && !w) break;

        double p = 1.0 * m / (m + w);
        double ret = 0.0;
        for (int i = 0; i <= c; i += 2){
            ret += C[c][i] * pow(p, i) * pow(1-p, c-i);
        }

        printf("%.7lf\n", ret);
    }

    return 0;
}

愿神与你同在!