|
本帖最后由 mikehood 于 2011-12-31 17:27 编辑
标准答案来了!
定义p(n,k)为练级n次后达到k级的概率,比如p(8,9)=0.3^8,再注意一些边界情况。
学过动态规划算法的同学应该能看懂:
public class Knife {
private static final int times = 1000;
private static final int max = 9;
private static double[][] sheet;
private static double p(int n, int k) {
double result;
if (sheet[n][k] != -1) {
result = sheet[n][k];
} else if (n == 0) {
result = 0;
} else if (n == 1 && k == 1) {
result = 0.7;
} else if (n < k - 1) {
result = 0;
} else if (n == k - 1) {
result = Math.pow(0.3, n);
} else if (k >= max - 1) {
result = p(n - 1, k - 1) * 0.3;
} else if (k == 1) {
result = p(n - 1, 2) * 0.7 + p(n - 1, 1) * 0.7;
} else {
result = p(n - 1, k - 1) * 0.3 + p(n - 1, k + 1) * 0.7;
}
sheet[n][k] = result;
return result;
}
public static void main(String[] args) {
sheet = new double[times + 1][max + 1];
for (int i = 0; i < times + 1; i++) {
for (int j = 0; j < max + 1; j++) {
sheet[j] = -1;
}
}
double rate = 0;
for (int i = max - 1; i <= times; i++) {
rate += p(i, max);
}
System.out.println(rate);
}
}
计算结果是0.22855682741303354 |
|