【NOIP2016提高组】换教室
https://www.luogu.org/problem/show?pid=1850
题面很长,实质很水的一道期望DP题。题面自带劝退效果。
首先用Floyd算出任意两点的最短路径。然后设f(i,j,0)为前i节课申请更换j节,且不申请第i节时的最小期望;设f(i,j,1)前i节课申请更换j节,且申请第i节时的最小期望。
可得下面这个超长的状转方程:
f(i,j,0)=min{
f(i-1,j,0) + dist(c[i-1],c[i]), // 不申请第i-1节
f(i-1,j,1) + k[i-1]*dist(d[i-1],c[i]) + (1-k[i-1])*dist(c[i-1],c[i]) // 申请第i-1节
}
f(i,j,1)=min{
f(i-1,j-1,0) + k[i]*dist(c[i-1],d[i]) + (1-k[i])*dist(c[i-1],c[i]), // 不申请第i-1节
f(i-1,j-1,1) + k[i-1]*k[i]*dist(d[i-1],d[i]) + (1-k[i-1])*k[i]*dist(c[i-1],d[i]) + k[i-1]*(1-k[i])*dist(d[i-1],c[i]) + (1-k[i-1])*(1-k[i])*dist(c[i-1],c[i]) // 申请第i-1节
}
注意f(i,0,0)意味着一节课都不申请,需要特判f(i,0,0)=f(i-1,0,0)+dist(c[i-1],c[i])
#include <cstdio>
#include <algorithm>
#define maxv 310
#define maxn 2010
using namespace std;
const int inf = ;
int v, e; // v表示牛牛学校里教室的数量;e表示牛牛的学校里道路的数量
int dist[maxv][maxv];
void add_edge(int from, int to, int weight)
{
dist[from][to] = min(dist[from][to], weight); //注意重边和自环
dist[to][from] = dist[from][to];
}
void floyd()
{
// d(k,i,j)=min{d(k-1,i,j), d(k-1,i,k)+d(k-1,k,j)}
for (int k = ; k <= v; k++)
for (int i = ; i <= v; i++)
for (int j = ; j <= v; j++)
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
int n, m; // n表示这个学期内的时间段的数量;m表示牛牛最多可以申请更换多少节课程的教室
int c[maxn]; // 第i个时间段牛牛被安排上课的教室
int d[maxn]; // 第i个时间段另一间上同样课程的教室
double k[maxn]; // 牛牛申请在第i个时间段更换教室获得通过的概率
void load()
{
scanf("%d%d%d%d", &n, &m, &v, &e);
for (int i = ; i <= n; i++)
scanf("%d", &c[i]);
for (int i = ; i <= n; i++)
scanf("%d", &d[i]);
for (int i = ; i <= n; i++)
scanf("%lf", &k[i]); for (int i = ; i <= v; i++) //初始化邻接矩阵
{
for (int j = ; j <= v; j++)
dist[i][j] = inf;
dist[i][i] = ;
} int tmp1, tmp2, tmp3;
for (int i = ; i <= e; i++)
{
scanf("%d%d%d", &tmp1, &tmp2, &tmp3);
add_edge(tmp1, tmp2, tmp3);
}
}
double dp[maxn][maxn][];
int main()
{
load();
floyd();
for (int i = ; i <= n; i++)
{
dp[i][][] = dp[i - ][][] + dist[c[i - ]][c[i]]; // f(i,0,0)意味着一节课都不申请,需要特判
dp[i][][] = ;
for (int j = ; j <= m; j++)
{
// 第1~i节课,申请更换j节,且不申请第i节时的最小期望
dp[i][j][] = min(
dp[i - ][j][] + dist[c[i - ]][c[i]], // 不申请第i-1节
dp[i - ][j][] + k[i - ] * dist[d[i - ]][c[i]] + ( - k[i - ]) * dist[c[i - ]][c[i]] // 申请第i-1节
); // 第1~i节课,申请更换j节,且申请第i节时的最小期望
dp[i][j][] = min(
dp[i - ][j - ][] + k[i] * dist[c[i - ]][d[i]] + ( - k[i]) * dist[c[i - ]][c[i]], // 不申请第i-1节
dp[i - ][j - ][] + k[i - ] * k[i] * dist[d[i - ]][d[i]] + ( - k[i - ]) * k[i] * dist[c[i - ]][d[i]] + k[i - ] * ( - k[i]) * dist[d[i - ]][c[i]] + ( - k[i - ]) * ( - k[i]) * dist[c[i - ]][c[i]] // 申请第i-1节
);
}
}
printf("%.2f", min(dp[n][m][], dp[n][m][]));
return ;
}
【NOIP2016提高组】换教室的更多相关文章
- [NOIp2016提高组]换教室
题目大意: 有n节课,第i节课在c[i]上课,同时d[i]也有一节课d[i]. 你有权利向教务处发出m次申请把自己的教室改到d[i],相应的批准概率是k[i]. 教室是图上的一些点,其中每条边都有边权 ...
- Luogu P1850 [NOIp2016提高组]换教室 | 期望dp
题目链接 思路: <1>概率与期望期望=情况①的值*情况①的概率+情况②的值*情况②的概率+--+情况n的值*情况n的概率举个例子,抛一个骰子,每一面朝上的概率都是1/6,则这一个骰子落地 ...
- 洛谷 1850 NOIP2016提高组 换教室
[题解] 先用floyed处理出两点间的最短路. 设f[i][j][k]表示走到第i个教室,总共换了j次,当前换或者不换,期望的最小移动距离. 分情况讨论来转移即可. #include<cstd ...
- 题解 P1850 [NOIP2016 提高组] 换教室
做完这道题才略微感觉自己懂了一点关于概率与期望的知识QAQ... 一:关于概率与期望的定义 转载节选于blog 1.什么是数学期望? 数学期望亦称期望.期望值等.在概率论和统计学中,一个离散型随机变量 ...
- 【题解】NOIP2016提高组 复赛
[题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...
- 【题解】NOIP2016 提高组 简要题解
[题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- [日记&做题记录]-Noip2016提高组复赛 倒数十天
写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...
- noip2016 提高组
T1 玩具谜题 题目传送门 这道题直接模拟就好了哇 233 #include<cstdio> #include<cstring> #include<algorithm&g ...
- NOIP2016 DAY1 T3 换教室
换教室 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节 课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内 ...
随机推荐
- 通过对DAO层的封装减少数据库操作的代码量
在学框架之前,写项目时总是要花大量的时间去写数据库操作层代码,这样会大大降低我们的效率,为了解决这个问题,我花了两天时间利用反射机制和泛型将DAO层进行了封装,这样我们只需要写sql语句,不需要再写 ...
- Paint the Grid Again (隐藏建图+优先队列+拓扑排序)
Leo has a grid with N × N cells. He wants to paint each cell with a specific color (either black or ...
- KICKSTART无人值守安装
1.1 环境说明 [root@test ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@test ~]# uname -r - ...
- web前端优化--DOM性能优化
1.DOM访问与修改的优化: DOM访问是有代价的,修改DOM则会引起DOM的重绘与重排,而这两种操作会消耗性能. (1)缓存DOM:将频繁访问的对象或属性使用变量缓存起来,每次访问的时候,直接使用变 ...
- jQuery选择器(可见性选择器)第五节
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- Python通过跳板机链接MySQL的一种方法
- ASP.NET Core中的OWASP Top 10 十大风险-失效的访问控制与Session管理
不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...
- webStorm恢复误删除文件或工程
背景: 提交git时可能由于没有提交所有文件,不知什么原因导致最近几天所写文件全部消失,所改文件全部恢复到以前.最终通过webstorm找回项目.下面总结通过webstorm找回误删文件,或恢复到历史 ...
- 【Kafka源码】处理请求
[TOC] 在KafkaServer中的入口在: apis = new KafkaApis(socketServer.requestChannel, replicaManager, groupCoor ...
- C#的Random到底该怎么使用
先看代码: 在循环中,有的只NEW一个Random,有的每次都NEW 一个Random. Console.WriteLine("1.多个Random,默认随机种子,"); ; i ...