동적 기획-바이두-버섯진
설명 입력:
첫 번째 줄 N, M, K (2≤N, M≤20, k≤100), N, M은 잔디 크기이고 다음 K 줄은 줄마다 두 개의 정수 x, y, 대표 (x, y)에 버섯이 있다.
출력 설명: 한 줄을 출력하여 원하는 확률(2자리 소수까지 보류)을 나타냅니다. 입력 예: 2 2 1 2 1 출력 예: 0.50
사고방식: 잘못된 해법: 첫 번째 반응 사고방식은 경로를 이용하여 하는 것이다. 갈 수 있는 경로/전체 경로를 이용하여 AC를 할 수 없다. 자세히 생각한 후에 경로가 전혀 같은 확률이 아니라는 것을 발견했다. 예를 들어 다음과 같다. 1 2 3 4 5 6
1-2:0.5, 2-3:0.5 3-6:1 그러므로 1-2-3-6 확률은:0.25이다.1-4:0.5, 4-5:1,5-6:1 따라서 1-4-5-6 확률은 0.5.경로에는 확률이 같지 않은 상황이 존재할 수 있다.정확한 사고방식: 사용 확률 dp.dp[i][j]는 (0,0)에서 (i,j) 사이의 확률이 얼마인지를 나타낸다.dp의 구체적인 상황은 대체로 세 가지가 있다.i, j가 모두 0일 때 dp[i][j]=1;2. i와 j가 버섯의 위치일 때 dp[i][j]=0;3. 세 번째 상황은 바로 우리의 추이 상황이다. 여기서 특히 경계를 주의해야 한다. 경계를 고려하지 않으면 다음과 같은 것을 얻을 수 있다. dp[i][j]=dp[i-1][j]*0.5+dp[i][j-1]*0.5;맨 오른쪽이나 맨 아래에 있을 때 0.5를 곱하지 않아도 된다. 상황에 따라 판단하면 다음은 완전한 판단이다.
dp[i][j]=(i-1<0?0:(j+1>=m?dp[i-1][j]:dp[i-1][j]*0.5))+(j-1<0?0:(i+1>=n?dp[i][j-1]:dp[i][j-1]*0.5));
구체적인 자바 코드는 다음과 같다.
package company;
import java.util.Scanner;
/** * A B, n*m ,A (1,1),B (n,m)。 A B, B , * (i,j+1) (i+1,j) , k ( ), :A * ( , ), B ? * Created by lizhaoz on 2016/4/15. */
public class Mushroom {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while (in.hasNext()){
int n = in.nextInt();
int m = in.nextInt();
int k = in.nextInt();
boolean[][] map=new boolean[n][m];
for (int i = 0; i < k; i++) {
int x=in.nextInt()-1;
int y=in.nextInt()-1;
map[x][y]=true;
}
double[][] dp=new double[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (i==0&&j==0){
dp[i][j]=1.0;
}
else if (map[i][j]==true){
dp[i][j]=0;
}else {
dp[i][j]=(i-1<0?0:(j+1>=m?dp[i-1][j]:dp[i-1][j]*0.5))+(j-1<0?0:(i+1>=n?dp[i][j-1]:dp[i][j-1]*0.5));
}
}
}
System.out.println(String.format("%.2f",dp[n-1][m-1]));
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
바이두의 별 자격 경기 코드 전집:각종 물문제야... B: C: D: E: F: F의 신 코드: G: H:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.