[题解]数学期望_luogu_P1850_换教室

数学期望dp,题面第一次见很吓人,然而从CCF语翻译成人话就简单多了,

开始一般会想到用 f [ i ] [ j ]表示前 i 个课程申请 j 次的期望,然而其实会发现转移的时候还和上一次的情况有关(有某概率取上一次某种情况)

所以用 f [ i ] [ j ] [ 0/1 ]记录这次申请与否,然后枚举每种情况用概率乘一下即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=2005;
int n,m,ver,edge;
int c[maxn],d[maxn];
long long dis[305][305];
double f[maxn][maxn][2],p[maxn],ans=0x3f3f3f3f;//第i次申请j次当前这次换/不换
void floyed(){
    for(int i=1;i<=ver;i++)dis[i][i]=0;
    for(int k=1;k<=ver;k++)
    for(int j=1;j<=ver;j++)
    for(int i=1;i<=ver;i++)
    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&ver,&edge);
    for(int i=1;i<=n;i++)scanf("%d",&c[i]);
    for(int i=1;i<=n;i++)scanf("%d",&d[i]);
    for(int i=1;i<=n;i++)scanf("%lf",&p[i]);
    memset(dis,0x3f,sizeof(dis));
    for(int i=1,u,v,w;i<=edge;i++){
        scanf("%d%d%d",&u,&v,&w);
        dis[u][v]=dis[v][u]=min(dis[u][v],(long long)w);
    }
    floyed();
    for(int i=0;i<=n;i++)
    for(int j=0;j<=n;j++)
    f[i][j][1]=f[i][j][0]=0x3f3f3f3f;
    f[1][0][0]=f[1][1][1]=0;
    for(int i=2;i<=n;i++){
        f[i][0][0]=f[i-1][0][0]+dis[c[i]][c[i-1]];//初始化为最坏情况
        for(int j=1;j<=min(i,m);j++){
            f[i][j][0]=min(f[i][j][0],min(f[i-1][j][0] + dis[c[i]][c[i-1]] , f[i-1][j][1]+p[i-1]*dis[c[i]][d[i-1]] + (1-p[i-1])*dis[c[i]][c[i-1]]));       //前一次不申请->前一次的加上这次体力,或者前一次申请->成功的期望+失败的期望
            f[i][j][1]=min(f[i][j][1],min(f[i-1][j-1][0] + p[i]*dis[c[i-1]][d[i]] +(1-p[i])*dis[c[i-1]][c[i]] ,     //上一次没有申请,
                           f[i-1][j-1][1] + p[i-1]*p[i]*dis[d[i]][d[i-1]]             //两次申请成功
                           + (1-p[i])*(1-p[i-1])*dis[c[i-1]][c[i]]               //两次申请失败
                           + (1-p[i])*p[i-1]*dis[d[i-1]][c[i]]                 //仅这次申请失败
                           + p[i]*(1-p[i-1])*dis[c[i-1]][d[i]]));           //仅上次申请失败             }
        }
    }
    for(int i=0;i<=m;i++)ans=min(ans,min(f[n][i][0],f[n][i][1]));
    printf("%.2lf\n",ans);
}

原文地址:https://www.cnblogs.com/superminivan/p/10680104.html

时间: 2024-10-08 01:16:45

[题解]数学期望_luogu_P1850_换教室的相关文章

题解 luogu P1850 【换教室】

题解 luogu P1850 [换教室] 时间:2019.8.6 一晚上(约 3.5h 写完) 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 \(2n\) 节课程安排在 \(n\) 个时间段上.在第 \(i\)(\(1 \leq i \leq n\))个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 \(c_i\) 上课,而另一节课程在教室 \(d_i\) 进行. 在不提交任何申请的情况下,学生们需要

Noip2016 换教室(数学期望入门)

题意:有2n个课程安排在n个时间段上,在第i个时间被安排在ci教室上课,但牛牛可以申请换教室,到di教室上课,但只有pi的可能成功.学校有v个教室,e条道路,每条路双向连通,每条路都会消耗一定的体力wi(保证每个教室可以互相到达),问牛牛应该怎么安排,才能使总花费的体力的期望值最小. 输入格式: 第一行四个整数n,m,v,e.n表示时间短的数量:m表示最多可以申请更换教室的数量:v表示教室的数量:e表示道路的数量. 第二行n个正整数,第i个表示ci: 第三行n个正整数,第i个表示di: 第四行n

[NOIP2016]换教室 D1 T3 Floyed+期望DP

[NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 i ( 1≤ i≤n)个时同段上, 两节内容相同的课程同时在不同的地点进行, 其中, 牛牛预先被安排在教室 ci上课, 而另一节课程在教室 di进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的n节安排好的课程.如果学生想更换第i节课程的教室,则需要提出中情.若申请通过,学生

[NOIP2016]换教室 题解(奇怪的三种状态)

2558. [NOIP2016]换教室 [题目描述] 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1<i<n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室ci上课,而另一节课程在教室di进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的n节安排好的课程.如果学生想更换第i节课程的教室,则需要提出申请.若申请通过,学生就可以在第i个时间段去教室di

Luogu P1850 换教室(期望dp)

P1850 换教室 题意 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有\(2n\)节课程安排在\(n\)个时间段上.在第\(i(1\leq i\leq n)\)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室\(c_i\)上课,而另一节课程在教室\(d_i\)进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的 nn 节安排好的课程.如果学生想更换第\(i\)节课程的教室,则需要提

【DP】【期望】$P1850$换教室

[DP][期望]\(P1850\)换教室 链接 题目描述 有 \(2n\) 节课程安排在$ n$ 个时间段上.在第 \(i\)(\(1 \leq i \leq n\))个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 \(c_i\)上课,而另一节课程在教室 \(d_i\)进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的 \(n\)节安排好的课程.如果学生想更换第 \(i\)节课程的教室,则需要提出申请.若申请通过,学生就可以在第 $i $个时

[BZOJ 4720][NOIP 2016] 换教室

记得某dalao立了"联赛要是考概率期望我直播吃键盘"的$flag$然后就有了这道题233333 4720: [Noip2016]换教室 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 879  Solved: 461[Submit][Status][Discuss] Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上. 在第i(1≤i≤n

P1850 换教室

P1850 换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤i≤n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 c_ic?i?? 上课,而另一节课程在教室 d_id?i?? 进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的 nn 节安排好的课程.如果学生想更换第 ii 节课程的教

洛谷P1850 换教室 最短路 + 动态规划

洛谷P1850 换教室最短路 + 动态规划 题解 首先预处理出任意两点的最短路 然后 dp f[ i ][ j ][ 0/1 ] 现在是 第 i 个时间段,已经申请 过 j次了,该次是否成功 0 否 1 成功 的最小的期望 主要是四个方面的转移 前一个是否申请 成功 or失败 当前是否申请 成功or失败 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 using namespace std ;