BZOJ P4720[Noip2016]换教室____solution
题目太长不表
<--无形传送,最为致命
学习一点数学期望的基础,预处理最短路,然后加上DP即可。(废话)
理解决策和结果的差别:
在这里每阶段的决策有两个:申请|不申请
结果有两个:换|不换
然而二者不是一一对应的关系;
而且决策意味着状态,结果只用于计算期望
为什么呢
因为答案要的就是对于某种决策组的期望
于是状态的设计应该是分为申请|不申请,
然后计算期望时讨论申请成不成功;
状态:f[i,j,0/1]讨论前i节课,申请j次,第三维=[第i节申请了]
方程:
//f[i][j][0]=f[i-1][j][0]+dis(ci-1,ci)*ff[i-1][j][0]|f[i-1][j][1]+dis(ci-1,ci)*ff[i-1][j][1]+dis(di-1,ci)*ff[i-1][j][2]
//f[i][j][1]=f[i-1][j-1][0]+(dis(ci-1,di)*ki+dis[ci-1,ci]*(1-ki))*ff[i-1][j-1][0]|f[i-1][j-1][1]+(dis(ci-1,di)*ki+dis(ci-1,ci)*(1-ki))*ff[i-1][j-1][1]+(dis(di-1,di)*ki+dis(di-1,ci)*(1-ki))*ff[i-1][j-1][2]
|表示两者选一(当然是选小的)
ff表示与f(也就是期望)同步存在的概率
dis是最短路
剩下的如题
对了最短路记得判重边。
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
double f[][][];
double ff[][][];
int dis[][];
int c[],d[];
double ki[];
int n,m,v,e;
int main()
{
int i,j,k,l;
double min=;
memset(dis,0x3f3f3f,sizeof(dis));
scanf("%d%d%d%d",&n,&m,&v,&e);
for(i=;i<=n;i++)scanf("%d",&c[i]);
for(i=;i<=n;i++)scanf("%d",&d[i]);
for(i=;i<=n;i++)scanf("%lf",&ki[i]);
for(i=;i<=e;i++){
scanf("%d%d%d",&j,&k,&l);
if(l<dis[j][k])
dis[j][k]=dis[k][j]=l;
}
for(k=;k<=v;k++)
for(i=;i<=v;i++)
for(j=;j<=v;j++)
if(i!=j)
if (dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j]=dis[i][k]+dis[k][j];
for(i=;i<=v;i++)dis[i][i]=;
for(i=;i<=n;i++)
for(j=;j<=m;j++)
f[i][j][]=f[i][j][]=,ff[i][j][]=ff[i][j][]=ff[i][j][]=;
ff[][][]=-ki[];ff[][][]=ki[];ff[][][]=;
f[][][]=;f[][][]=;
for(i=;i<=n;i++)
for(j=;j<=m;j++){
if(f[i-][j][]+dis[c[i-]][c[i]]*ff[i-][j][]<f[i-][j][]+dis[c[i-]][c[i]]*ff[i-][j][]+dis[d[i-]][c[i]]*ff[i-][j][])
f[i][j][]=f[i-][j][]+dis[c[i-]][c[i]]*ff[i-][j][],ff[i][j][]=ff[i-][j][];
else
f[i][j][]=f[i-][j][]+dis[c[i-]][c[i]]*ff[i-][j][]+dis[d[i-]][c[i]]*ff[i-][j][],ff[i][j][]=ff[i-][j][]+ff[i-][j][];
if(j>){
if(f[i-][j-][]+(dis[c[i-]][d[i]]*ki[i]+dis[c[i-]][c[i]]*(-ki[i]))*ff[i-][j-][]<f[i-][j-][]+(dis[c[i-]][d[i]]*ki[i]+dis[c[i-]][c[i]]*(-ki[i]))*ff[i-][j-][]+(dis[d[i-]][d[i]]*ki[i]+dis[d[i-]][c[i]]*(-ki[i]))*ff[i-][j-][])
f[i][j][]=f[i-][j-][]+(dis[c[i-]][d[i]]*ki[i]+dis[c[i-]][c[i]]*(-ki[i]))*ff[i-][j-][],ff[i][j][]=ff[i-][j-][]*(-ki[i]),ff[i][j][]=ff[i-][j-][]*ki[i];
else
f[i][j][]=f[i-][j-][]+(dis[c[i-]][d[i]]*ki[i]+dis[c[i-]][c[i]]*(-ki[i]))*ff[i-][j-][]+(dis[d[i-]][d[i]]*ki[i]+dis[d[i-]][c[i]]*(-ki[i]))*ff[i-][j-][],ff[i][j][]=(ff[i-][j-][]+ff[i-][j-][])*(-ki[i]),ff[i][j][]=(ff[i-][j-][]+ff[i-][j-][])*ki[i];
}
}
for(i=;i<=m;i++){
if(min>f[n][i][])min=f[n][i][];
if(min>f[n][i][])min=f[n][i][];
}
printf("%.2lf",min);
return ;
}
现在想来,我还真是弱啊
BZOJ P4720[Noip2016]换教室____solution的更多相关文章
- BZOJ 4720 [Noip2016]换教室
4720: [Noip2016]换教室 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i( ...
- bzoj 4720: [Noip2016]换教室【期望dp】
状压dp,设f[i][j][0/1]为前i个时间段换了j间教室的期望体力消耗,转移很好想(但是写起来好长= =) #include<iostream> #include<cstdio ...
- 【BZOJ】4720: [Noip2016]换教室
4720: [Noip2016]换教室 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1690 Solved: 979[Submit][Status ...
- [NOIP2016]换教室 D1 T3 Floyed+期望DP
[NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...
- bzoj4720: [Noip2016]换教室(期望dp)
4720: [Noip2016]换教室 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1294 Solved: 698[Submit][Status ...
- [NOIP2016]换教室 题解(奇怪的三种状态)
2558. [NOIP2016]换教室 [题目描述] 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1< ...
- NOIP2016换教室 BZOJ 4720
BZOJ 4720 换教室 题目描述: 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节 课程安排在n个时间段上.在第i(1≤i≤n)个时间段上 ...
- 【bzoj4720】[NOIP2016]换教室
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的 ...
- [NOIp2016] 换教室
题目类型:期望\(DP\) 传送门:>Here< 题意:现有\(N\)个时间段,每个时间段上一节课.如果不申请换教室,那么时间段\(i\)必须去教室\(c[i]\)上课,如果申请换课成功, ...
随机推荐
- Error:(1, 1) 错误: 需要class, interface或enum
这个东西在Ideal里面报的错误,在控制台提示: Error:(1, 1) 错误: 需要class, interface或enum 网上搜到说是编码问题,我的解决方式: 把出错的文件选中复制一份,再随 ...
- 学习前端页面css定位
css元素框定位 一.相对定位: 相对定位是一个非常容易掌握的概念.如果对一个元素进行相对定位,它将出现在它所在的位置上.然后,可以通过设置垂直或水平位置,让这个元素“相对于”它的起点进行移动.pos ...
- freemaker的函数使用
如下: <html> <body> <div class="container"> <h4>修改用户角色</h4> &l ...
- C#效率提升总结
1. 尽量减少装箱 尽量减少字符串之间拼接 优先用StringBuilder,因为不会多次分配内存 String.Format()内部其实是调用了StringBuilder(),所以效率很高 2. 转 ...
- Python使用浏览器模拟访问页面之使用ip代理
最近需要使用浏览器模拟访问页面,同时需要使用不同的ip访问,这个时候就考虑到在使用浏览器的同时加上ip代理. 本篇工作环境为win10,python3.6. Chorme 使用Chrome浏览器模拟访 ...
- (转)CentOS 7 安装 Python3、pip3
原文:https://ehlxr.me/2017/01/07/CentOS-7-%E5%AE%89%E8%A3%85-Python3%E3%80%81pip3/ CentOS 7 默认安装了 Pyth ...
- Javascript之in操作符的用法
in操作符是js里面常用的一个操作符,下面是其几个常用的功能: 1.配合for语句循环遍历/迭代数组中的元素 2.配合for语句循环遍历/迭代集合中的属性 3.判断对象是否是数组的元素 4.判断对象是 ...
- Redis快照持久化
Redis的持久化功能: redis为了内部数据的安全考虑,会把本身的数据以文件的形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)里边. 数据保存到硬盘的过程就被称为” ...
- Logback 学习笔记
来源:http://webinglin.github.io/2015/06/04/Logback-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/ Logback背景 Log ...
- erlang尾递归练习
1 %%计算链表长度尾递归实现 2 lez(N) -> lez(N, 0). 3 4 lez([], Acc) -> Acc; 5 lez([_ | T], Acc) -> lez( ...