正解:期望dp

解题报告:

哇我发现我期望这块真的布星,可能在刷了点儿NOIp之后会去搞一波期望dp的题...感觉连基础都没有打扎实?基础概念都布星!

好那先把这题理顺了嗷qwq

首先我们看到期望就会想到dp是趴,加上dp也确实很NOIp那就直接往dp的方向想嘛

比较容易想到的状态就是f[i][j]表示到第i个阶段了然后已经申请了j次的最小体力,然而在思考转移方程的时候就会发现如果这么设的话好像是不会转移的嗷,因为我们之后的转移会和你上一次是去的c还是d有关,然后就考虑再加一轮[0/1]表示上次申请了没有

然后转移这儿,巨麻烦一点点扣

f[i][j][0]:到第i个阶段了申请了j次这次没申请

既然这次没申请那i-1状态肯定也是申请j次,于是可以知道是从f[i][j]转移来的,这里简单

然后有几种可能呢?

    • 上次没申请,那就是f[i][j][0],此时的概率是100%(不申请百分百通不过嘛),那就是f[i][j][0]+dis[c[i-1]][c[i]]
    • 上次申请了,那就是f[i][j][1],此时可能通过可能没通过,如果通过了+dis[d[i-1]][c[i]]*k[i-1],没通过+dis[c[i-1]][c[i]]*(1-k[i-1])
    • 总结起来就是 min( f[i-1][j][0] + jl[c[i-1]][c[i]] , f[i-1][j][1] + (1-k[i-1])*jl[c[i-1]][c[i]] + k[i-1]*jl[d[i-1]][c[i]])

f[i][j][1]:到第i个阶段了申请了j次这次申请了

理由同上,可以知道是从f[i][j-1]转移来的

这个就会比较长了...

    • 上次没申请,f[i][j-1][0],这时有俩可能,如果这次申请通过了,+dis[c[i-1]][d[i]]*k[i],没通过,+dis[c[i-1]][c[i]]*(1-k[i])
    • 总结起来就是 f[i-1][j-1][0] + k[i]*jl[c[i-1]][d[i]] + (1-k[i])*jl[c[i-1]][c[i]]
    • 上次申请了,f[i][j-1][1],然后有四种可能(上次/这次通过否 因此22
    • 如果上次通过了这次通过了,+dis[d[i-1]][d[i]]*k[i-1]*k[i],如果上次通过了这次没通过,+dis[d[i-1]][c[i]]*k[i-1]*(1-k[i]),如果上次没通过这次通过了,+dis[c[i-1]][d[i]]*(1-k[i-1])*k[i],如果上次没通过这次还是没通过,+dis[c[i-1]][c[i]]*(1-k[i-1])*(1-k[i])
    • 总结起来就是f[i-1][j-1][1] + (1-k[i-1])*(1-k[i])*jl[c[i-1]][c[i]] + (1-k[i-1])*k[i]*jl[c[i-1]][d[i]] + k[i-1]*(1-k[i])*jl[d[i-1]][c[i]] + k[i-1]*k[i]*jl[d[i-1]][d[i]]
    • 然后这整个儿就是 min( f[i-1][j-1][0] + k[i]*jl[c[i-1]][d[i]] + (1-k[i])*jl[c[i-1]][c[i]] , f[i-1][j-1][1] + (1-k[i-1])*(1-k[i])*jl[c[i-1]][c[i]] + (1-k[i-1])*k[i]*jl[c[i-1]][d[i]] + k[i-1]*(1-k[i])*jl[d[i-1]][c[i]] + k[i-1]*k[i]*jl[d[i-1]][d[i]] )

昂然后我觉得这个理顺了就差不多了?最后放个代码就好了qwq

#include<bits/stdc++.h>
using namespace std;
#define rp(i,x,y) for(register int i=x;i<=y;++i)

+,N=+,M=+;
;
int n,m,v,e,c[N],d[N],jl[V][V];
],ans=;

inline int read()
{
    ;;
    '))ch=getchar();
    if(ch=='-')ch=getchar();
    )+(x<<)+(ch^'),ch=getchar();
    return y?x:-x;
}
inline void floyd()
{
    rp(k,,v)
        rp(i,,v)
            rp(j,,i-)jl[j][i]=jl[i][j]=min(jl[i][j],jl[k][i]+jl[j][k]);
}
inline double min3(double x,double y,double z){return min(min(x,y),z);}

int main()
{
    n=read();m=read();v=read();e=read();
    rp(i,,n)c[i]=read();rp(i,,n)d[i]=read();
    rp(i,,n)scanf("%lf",&k[i]);
    rp(i,,v)rp(j,,i-)jl[i][j]=jl[j][i]=(int)inf;
    rp(i,,e){int t1=read(),t2=read(),t3=read();jl[t1][t2]=min(t3,jl[t1][t2]);jl[t2][t1]=jl[t1][t2];}
    floyd();
    rp(i,,n)
        rp(j,,m)f[i][j][]=f[i][j][]=inf;
    f[][][]=f[][][]=;
    rp(i,,n)
    {
        rp(j,,m)
        {
            f[i][j][]=min( f[i-][j][] + jl[c[i-]][c[i]] , f[i-][j][] + (-k[i-])*jl[c[i-]][c[i]] + k[i-]*jl[d[i-]][c[i]]);
            )
            {
                f[i][j][]=min( f[i-][j-][] + k[i]*jl[c[i-]][d[i]] + (-k[i])*jl[c[i-]][c[i]] , f[i-][j-][] + (-k[i-])*(-k[i])*jl[c[i-]][c[i]] + (-k[i-])*k[i]*jl[c[i-]][d[i]] + k[i-]*(-k[i])*jl[d[i-]][c[i]] + k[i-]*k[i]*jl[d[i-]][d[i]] );
            }
        }
    }
    rp(i,,m)ans=min3(ans,f[n][i][],f[n][i][]);
    printf("%.2lf",ans);
}
//哦还有个细节,就,这个题目的初值赋值的时候要注意一下...我开始开小了然后只88,后来开大了点儿又爆了范围直接变成负数...ummm...真实烦skr人QAQ然后还交了两次才过的...

洛谷P1850 换教室 [noip2016] 期望dp的更多相关文章

  1. 洛谷P1850 换教室(概率dp)

    传送门 我的floyd竟然写错了?今年NOIP怕不是要爆零了? 这就是一个概率dp 我们用$dp[i][j][k]$表示在第$i$个时间段,已经申请了$j$次,$k$表示本次换或不换,然后直接暴力转移 ...

  2. 洛谷——P1850 换教室

    P1850 换教室 有 2n 节课程安排在 nn 个时间段上.在第 i个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 $c_i$​ 上课,而另一节课程在教室 $d_i$ ...

  3. 洛谷 P1850 换教室

    P1850 换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq ...

  4. 洛谷 P1850 换教室 解题报告

    P1850 换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有\(2n\)节课程安排在\(n\)个时间段上.在第\(i(1≤i≤n) ...

  5. 洛谷P1850换教室

    题目传送门 理解题意:给定你一个学期的课程和教室数量以及教室之间的距离还有换教室成功的概率,求一个学期走的距离的期望最小值 题目是有够恶心的,属于那种一看就让人不想刷的题目...很明显的动规,但是那个 ...

  6. 洛谷P1850 换教室_数学期望_Floyd

    调了一下午QAQ-让我对数学期望的理解又提升了一个层次. 首先,我们发现 v<=300v<=300v<=300 , 这样我们就可以用 FloydFloydFloyd 算法来 O(n3 ...

  7. Luogu P1850换教室【期望dp】By cellur925

    题目传送门 首先这个题我们一看它就是和概率期望有关,而大多数时候在OI中遇到他们时,都是与dp相关的. \(Vergil\)学长表示,作为\(NOIp2016\)的当事人,他们考前奶联赛一定不会考概率 ...

  8. 洛谷P1850 换教室

    令人印象深刻的状态转移方程... f[i][j][0/1]表示前i个换j次,第i次是否申请时的期望. 注意可能有重边,自环. 转移要分类讨论,距离是上/这次成功/失败的概率乘相应的路程. 从上次的0/ ...

  9. 【Luogu】P1850换教室(期望DP)

    题目链接 又一道面向题解编程的恶心神题.真是叫人质壁分离…… 设f[i][j][k]表示考虑了前i节课,尝试了j次,当前申请结果为k时消耗的体力值. 对于f[i][j][0]有两种情况:一是我们的主角 ...

随机推荐

  1. /etc/issue

    /etc/issue 与 /etc/motd 作用一致,都是用于显示欢迎信息,区别在于 /etc/issue 是在 login 提示符之前显示,而 /etc/motd 则在在用户成功登录系统之后显示 ...

  2. Java实现给定字符串的倒序输出

    1.除2判中法: public static String orderDesc(String str){ byte [] bytes = str.getBytes(); for ( int i = 0 ...

  3. iOS - UITableViewStylePlain与UITableViewStyleGroup样式的对比

    一.UITableViewStylePlain 1.有多段时 段头停留(自带效果) 2.没有中间的间距和头部间距(要想有的重写UITableViewCell \UITableViewHeaderFoo ...

  4. JavaScript的数据类型---最全,最详细的数据类型,高级的工程师从数据类型开始

    一.基本数据类型 1.字符串数据类型     var hello="你好啊";     var hello='你好啊';示例:<script language="j ...

  5. 服务器搭建--Linux安装erlang

    1.安装依赖环境: 1)安装GCC GCC-C++ Openssl等模块,安装过就不需要安装了 yum -y install make gcc gcc-c++ kernel-devel m4 ncur ...

  6. 关于Android开发中使用的XML

    1.布局 FrameLayout: 以堆叠方式显示一个或多个子视图. GridLayout: 将子视图按行和列排列. LinearLayout: 将所有子视图排列成一行或一列. RelativeLay ...

  7. 【python问题】UnicodeEncodeError: 'ascii' codec can't encode characters in position 306-309: ordinal not in range(128)

    今天在写python爬虫的时候,遇到一个问题 UnicodeEncodeError: 'ascii' codec can't encode characters in position 306-309 ...

  8. 【.NetCore学习】ASP.NET Core EF Core2.0 DB First现有数据库自动生成实体Context

    主要参考微软官方文档 https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db Microsoft .NE ...

  9. Python基础---->python的使用(二)

    学习一下python,这里对python的基础知识做一个整理.似等了一百年忽而明白,即使再见面,成熟地表演,不如不见. python的一些应用 一.类似于java中的MessageFormat用法 w ...

  10. Qt编写的RTSP播放器+视频监控(vlc版本)

    几天写了个ffmpeg版本,今天特意抽空改写个vlc版本,之前vlc播放视频后,被接管了不能识别到鼠标,需要重新编译vlc源码得到支持鼠标消息的版本. /*** vlc视频播放类 作者:feiyang ...