《投掷硬币》题目分析
本题是一道比较简单的概率DP。
我们可以用f[i][j]
表示投掷i枚硬币,其中j面向上的概率。那么有:
f[i][j] = f[i-1][j] * (1 - Pi) + f[i-1][j-1] * Pi
按照以上递推式计算出f[N][M]
的值即可。
本题是一道比较简单的概率DP。
我们可以用f[i][j]
表示投掷i枚硬币,其中j面向上的概率。那么有:
f[i][j] = f[i-1][j] * (1 - Pi) + f[i-1][j-1] * Pi
按照以上递推式计算出f[N][M]
的值即可。
咋回事,过不了,网上找到所有这题的都过不了
double calcProbability(unsigned int m, unsigned int n) { double probability = 0;
if (m < n || 0 == m) return 0;
if ( 1 == m && 0==n) return PI;
if (1 == m && 1 ==n) return PI;
return calcProbability(m-1, n)*(1-PI) + calcProbability(m-1, n-1)*PI;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
float[] p = new float[N+1];
float[][] dp = new float[N+1][N+1];
dp[0][0] = 1;
for (int i = 1; i <= N; i++) {
p[i] = sc.nextFloat();
dp[i][i] = p[i] * dp[i - 1][i - 1];
dp[i][0] = (1 - p[i]) * dp[i - 1][0];
}
for (int i = 1; i <= N; i++) {
int temp = i > M ? M : i;
int j = 1;
while (j <= temp) {
if(j<i) {
dp[i][j] = p[i] * dp[i - 1][j] + (1 - p[i]) * dp[i - 1][j - 1];
}
j++;
}
}
System.out.println(String.format("%.6f",dp[N][M]));
}
} 不知道哪里错了。。求大佬点拨一下。。
评测机挂了 现在已经修复了