/*동적 계획법*/#include <iostream>#include <stdio.h>#include <vector>#include <string.h>usingnamespacestd;doublewhereisteacher[101][50];// [D][K]에 D날에 K번째 마을의 확률floatrealation[50][50];// [D][K] D에서 K로 가는 길의 유무intmanyline[50];intmain(){inti,j,k,l,o;intN,D,P,C;//C 테스터 개수, N마을 개수, D D 일 후의 확률 P 감옥 위치intH;inta;doublesum=0;scanf("%d",&C);for(i=0;i<C;i++){scanf("%d %d %d",&N,&D,&P);for(k=0;k<N;k++){for(l=0;l<N;l++){scanf("%d",&a);if(a==1){realation[k][l]=1;manyline[l]++;// l 칸에 연결되어 있는 마을의 갯수}}}whereisteacher[0][P]=1;//탈출전에 감옥 에 있다.for(j=1;j<=D;j++){for(k=0;k<N;k++){for(l=0;l<N;l++){if(realation[l][k]==1){sum+=(whereisteacher[j-1][l]/manyline[l]);// k로 올 확률은 연결되어 있는 마을의 확률에 그 마을에 인접한 마을의 개수로 나눈 값을 모두 더해주면 그 마을에 있을 수 있는 확률이 나옴}}whereisteacher[j][k]=sum;//sum=0;}}scanf("%d",&H);// 확률을 출력해야할 마을의 개수while(H!=0){scanf("%d",&o);// 확률 출력printf("%.8f ",whereisteacher[D][o]);H--;}printf("\n");memset(whereisteacher,0,100*50);memset(realation,0,50*50);memset(manyline,0,50);}return0;}
16ms 에서 문제가 오답이라고 나온것을 보아 코드가 잘못 짜여진거라고 생각합니다.
문제 기본적 해결 방식은 D 일의 확률은 D-1의 확률로 구할 수 있다를 이용해 동적계획법으로 구상해 보았습니다. 그래서 D 날의 x 라는 마을에 올 확률을 구하려면 D-1 날에서 마을 x와 연결된 모든 마을의 확률을 연결된 각각의 마을을 그 마을이 연결된 마을의 개수로 나누고 더해서 구했습니다.
도움이 필요합니다!
7년 전
0개의 댓글이 있습니다.
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면
온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야
합니다. 현재 문제를 푸셨습니다.
9574m
16ms 에서 문제가 오답이라고 나온것을 보아 코드가 잘못 짜여진거라고 생각합니다.
문제 기본적 해결 방식은 D 일의 확률은 D-1의 확률로 구할 수 있다를 이용해 동적계획법으로 구상해 보았습니다. 그래서 D 날의 x 라는 마을에 올 확률을 구하려면 D-1 날에서 마을 x와 연결된 모든 마을의 확률을 연결된 각각의 마을을 그 마을이 연결된 마을의 개수로 나누고 더해서 구했습니다.
도움이 필요합니다!
7년 전