130、鳄鱼!水泡?大作战!.docx
方法优劣分析
优点:这种方法可以准确地计算出期望得分。
缺点:需要两层循环,某些极端情况下时间复杂度很高。
时间复杂度分析
时间复杂度为?O(n)O(n×100)=O(n)。
空间复杂度O(n)O(n×100)=O(n)。
AC_Code
C++
#includeiostream
#includevector
usingnamespacestd;
intmain(){
intn;
cinn;
vectorpairint,intballoons(n);
for(inti=0;in;i++){
cinballoons[i].firstballoons[i].second;
}
//dp[i][j]代表在第i轮,击中概率为j%时的期望得分。
vectorvectordoubledp(n+1,vectordouble(101,0));
dp[0][balloons[0].first]=0;//初始概率
for(inti=1;i=n;i++){
inta=balloons[i-1].first,b=balloons[i-1].second;
for(intj=0;j=100;j++){//0到100的击中概率
doublehit_prob=j/100.0;
doublemiss_prob=1-hit_prob;
intprev_prob=min(j+10,100);//增加10%但最大为100%
dp[i][j]=hit_prob*(dp[i-1][prev_prob]+b)+miss_prob*dp[i-1][j];
}
}
printf(%.2lf\n,dp[n][balloons[0].first]);
return0;
}
Java
importjava.util.Scanner;
importjava.util.ArrayList;
importjava.util.List;
publicclassMain{
publicstaticvoidmain(String[]args){
Scannerscanner=newScanner(System.in);
intn=scanner.nextInt();
Listint[]balloons=newArrayList();
for(inti=0;in;i++){
inta=scanner.nextInt();
intb=scanner.nextInt();
balloons.add(newint[]{a,b});
}
//dp[i][j]代表在第i轮,击中概率为j%时的期望得分。
double[][]dp=newdouble[n+1][101];
dp[0][balloons.get(0)[0]]=0;//初始概率
for(inti=1;i=n;i++){
inta=balloons.get(i-1)[0],b=balloons.get(i-1)[1];
for(intj=0;j=100;j++){//0到100的击中概率
doublehitProb=j/100.0;
doublemissProb=1-hitProb;
intprevProb=Math.min(j+10,100);//增加10%但最大为100%
dp[i][j]=hitProb*(dp[i-1][prevProb]+b)+missProb*dp[i-1][j];
}