uva 542 France '98
10534 단어 uva
DP 스트리밍이나 기억력 검색 모두 가능합니다.
dp[i][left][right]를 설정하면 i팀은 제left에서 제right팀까지 우승할 확률을 나타낸다. 그래서 마지막으로 필요한 것은 dp[i][16]이다.한 팀이 면전에서 우승하려면 그 전에 우승해야 돼요.
그래서mid=(left+right)/2;
i와 j가 [left,right]에서 우승을 쟁탈한다(예를 들어 i와 j가 1에서 16까지 우승을 쟁탈한다. 즉, 총 우승을 쟁탈한다). 그러면 i와 j는 반드시 두 구역에서 온 것이다.
left<=i<=mid, 그러면 dp[i][left][mid], dp[j][mid+1][right]를 획득해야 합니다.
mid+1<=i<=right, 그러면 dp[i][mid+1][right], dp[j][left][mid]
코드를 구체적으로 보시죠.
DP 스핀들
#include <cstdio>
#include <cstring>
double p[20][20],dp[20][20][20];
char name[20][50];
int main()
{
int N=16;
for(int i=1; i<=N; i++) scanf("%s",name[i]);
for(int i=1; i<=N; i++)
for(int j=1; j<=N; j++)
{ scanf("%lf",&p[i][j]); p[i][j]/=100; }
int len,left,right,mid,i,j;
memset(dp,0,sizeof(dp));
for(int i=1; i<=N; i++) dp[i][i][i]=1;
for(len=2; len<=N; len*=2)
for(left=1; left<=N; left+=len)
{
right=left+len-1; mid=(left+right)/2;
for(i=left; i<=mid; i++)
for(j=mid+1; j<=right; j++)
{
dp[i][left][right]+=p[i][j]*dp[i][left][mid]*dp[j][mid+1][right];
dp[j][left][right]+=p[j][i]*dp[i][left][mid]*dp[j][mid+1][right];
}
}
for(i=1; i<=N; i++) printf("%-10s p=%.2f%%
",name[i],dp[i][1][N]*100);
return 0;
}
DO 메모리 검색
#include <cstdio>
#include <cstring>
struct team
{
char name[110];
int n;
}a[20];
double p[20][20];
double dp[20][20][20];
void dfs(int i ,int left ,int right)
{
if(dp[i][left][right]!=-1) return ;
int mid=(left+right)/2;
int l1,r1,l2,r2;
if(i<=mid) {l1=left; r1=mid; l2=mid+1; r2=right;}
else {l1=mid+1; r1=right; l2=left; r2=mid;}
dp[i][left][right]=0;
for(int j=l2; j<=r2; j++)
{
dfs(i,l1,r1); dfs(j,l2,r2);
dp[i][left][right]+=p[i][j]*dp[i][l1][r1]*dp[j][l2][r2];
}
}
int main()
{
int N=16;
for(int i=1; i<=N; i++)
{ scanf("%s",a[i].name); a[i].n=i; }
for(int i=1; i<=N; i++)
for(int j=1; j<=N; j++)
{ scanf("%lf",&p[i][j]); p[i][j]/=100; }
for(int i=1; i<=N; i++)
for(int j=1; j<=N; j++)
for(int k=1; k<=N; k++)
dp[i][j][k]=-1;
for(int i=1; i<=N; i++) dp[i][i][i]=1;
int left=1,right=N,mid,l1,r1,l2,r2;
mid=(left+right)/2;
for(int i=left; i<=right; i++)
{
if(i<=mid) {l1=left; r1=mid; l2=mid+1; r2=right;}
else {l1=mid+1; r1=right; l2=left; r2=mid;}
dp[i][left][right]=0.0;
for(int j=l2; j<=r2; j++)
{
dfs(i,l1,r1); dfs(j,l2,r2);
dp[i][left][right]+=p[i][j]*dp[i][l1][r1]*dp[j][l2][r2];
}
printf("%-10s p=%.2f%%
", a[i].name , dp[i][left][right]*100);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
UVA - 10986 Sending email(Dijkstra 인접 테이블 + 우선 순위 대기열 최적화)제목 대의: s점에서 t점까지의 최소 거리를 구하는 그림을 주세요. 확인: 적나라한 최단길이지만 n이 너무 크면 인접 행렬을 사용할 수 없기 때문에 Dijkstra에 대한 인접표 + 우선 대기열 최적화가 필요합니다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.