Luogu 1580 [NOIP2016] 换教室
先用Floyed做亮点之间的最短路,设计dp,记dp[i][j][0]为到第i节课,换了j次课,当前有没有换课达到的期望耗费体力最小值
方程(太长了还是看代码吧):
dp[i][j][0]<-dp[i - 1][j][0]
dp[i][j][0]<-dp[i - 1][j][1]
dp[i][j][1]<-dp[i - 1][j - 1][0]
dp[i][j][1]<-dp[i - 1][j - 1][1]
~~感觉跟没说一样~~
初值: inf, dp[1][0][0] = dp[1][1][1] = 0
在每一次枚举m转移之前有 dp[i][0][0] = dp[i - 1][0][0] + dis[c[i - 1]][c[i]]
转移顺序:……显然从小到大枚举转移
【锅】
一开始没有想清楚状态之间的关系, 只设计了两维dp,于是,这个样例完美地救了我,下次在搞之前还是要手算一遍a
Code:
#include <cstdio> using namespace std; typedef double db; const int N = ;
const int P = ;
const int inf = << ; int n, m, pNum, eNum, c[N], d[N], dis[P][P];
db k[N], dp[N][N][]; template <typename T>
inline T min(T x, T y) {
return x > y ? y : x;
} inline void floyed() {
for(int l = ; l <= pNum; l++)
for(int i = ; i <= pNum; i++)
for(int j = ; j <= pNum; j++)
dis[i][j] = min(dis[i][j], dis[i][l] + dis[l][j]);
} int main() {
scanf("%d%d%d%d", &n, &m, &pNum, &eNum);
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 <= pNum; i++)
for(int j = ; j <= pNum; j++)
if(i != j) dis[i][j] = inf;
for(int x, y, v, i = ; i <= eNum; i++) {
scanf("%d%d%d", &x, &y, &v);
dis[x][y] = min(dis[x][y], v);
dis[y][x] = dis[x][y];
}
floyed(); /* for(int i = 2; i <= n + 1; i++)
for(int j = 1; j <= m; j++)
dp[i][j] = (db)inf;
for(int i = 1; i <= n + 1; i++)
dp[i][0] = dp[i - 1][0] + (db) dis[c[i - 1]][c[i]];
db ans = dp[n + 1][0];
printf("%.2f ", dp[n + 1][0]);
for(int i = 2; i <= n + 1; i++)
for(int j = 1; j <= m; j++) {
dp[i][j] = min(dp[i][j], dp[i - 1][j] + (db)dis[c[i - 1]][c[i]]); db t = dp[i - 2][j - 1];
t += (db) k[i] * (dis[c[i - 2]][d[i - 1]] + dis[d[i - 1]][c[i]]);
t += (db) (1 - k[i]) * (dis[c[i - 2]][c[i - 1]] + dis[c[i - 1]][c[i]]);
dp[i][j] = min(dp[i][j], t); if(i == n + 1) ans = min(dp[i][j], ans);
}
printf("%.2f %.2f %.2f ", dp[1][1], dp[2][1], dp[3][2]);
ans = min(ans, dp[n + 1][0]); */ for(int i = ; i<= n; i++)
for(int j = ; j <= m; j++)
for(int l = ; l <= ; l++)
dp[i][j][l] = (db) inf;
dp[][][] = dp[][][] = ; db ans = (db) inf;
for(int i = ; i <= n; i++) {
dp[i][][] = dp[i - ][][] + dis[c[i - ]][c[i]];
for(int j = ; j <= m; j++) { db p[];
p[] = k[i - ], p[] = k[i], p[] = - k[i - ], p[] = - k[i]; int t[];
t[] = c[i - ], t[] = d[i - ], t[] = c[i], t[] = d[i]; dp[i][j][] = min(dp[i][j][], dp[i - ][j][] + dis[t[]][t[]]);
dp[i][j][] = min(dp[i][j][], dp[i - ][j][] + p[] * dis[t[]][t[]] + p[] * dis[t[]][t[]]); dp[i][j][] = min(dp[i][j][], dp[i - ][j - ][] + p[] * dis[t[]][t[]] + p[] * dis[t[]][t[]]);
dp[i][j][] = min(dp[i][j][], dp[i - ][j - ][] + p[] * p[] * dis[t[]][t[]] + p[] * p[] * dis[t[]][t[]] + p[] * p[] * dis[t[]][t[]] + p[] * p[] * dis[t[]][t[]]);
if(i == n) ans = min(ans, min(dp[i][j][], dp[i][j][]));
}
}
ans = min(ans, dp[n][][]); printf("%.2f", ans);
return ;
}
Luogu 1580 [NOIP2016] 换教室的更多相关文章
- [NOIP2016]换教室 D1 T3 Floyed+期望DP
[NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...
- BZOJ 4720 [Noip2016]换教室
4720: [Noip2016]换教室 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i( ...
- 【BZOJ】4720: [Noip2016]换教室
4720: [Noip2016]换教室 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1690 Solved: 979[Submit][Status ...
- bzoj4720: [Noip2016]换教室(期望dp)
4720: [Noip2016]换教室 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1294 Solved: 698[Submit][Status ...
- [Luogu 1850] noip16 换教室
[Luogu 1850] noip16 换教室 好久没有更博客了,先唠嗑一会,花了两天的空闲时间大致做完了昨年的noip真题 虽然在经过思考大部分题目都可出解(天天爱跑步除外),但是并不知道考试时候造 ...
- [NOIP2016]换教室 题解(奇怪的三种状态)
2558. [NOIP2016]换教室 [题目描述] 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1< ...
- [NOIP2016]换教室(概率期望$DP$)
其实吧我老早就把这题切了--因为说实话,这道题确实不难啊--李云龙:比他娘的状压DP简单多了 今天我翻以前在Luogu上写的题解时,突然发现放错代码了,然后被一堆人\(hack\)--蓝瘦啊\(ORZ ...
- 【bzoj4720】[NOIP2016]换教室
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的 ...
- [NOIp2016] 换教室
题目类型:期望\(DP\) 传送门:>Here< 题意:现有\(N\)个时间段,每个时间段上一节课.如果不申请换教室,那么时间段\(i\)必须去教室\(c[i]\)上课,如果申请换课成功, ...
随机推荐
- 剑指offer-第六章面试中的各项能力(翻转单词的顺序VS左旋转字符串)
//题目1:翻转单词顺序例如“Hello world!”翻转后为world! Hello. //思路:首先翻转整个字符串,然后再分别翻转每个单词. //题目2:左旋转字符串,是将字符串的前面几个(n) ...
- Visual Studio 2013 帮助文档 安装以及如何直接打开
1.在线安装VS2013的MSDN帮助文档 在利用VS2013集成开发环境(IDE)开发程序代码时会经常用到帮助文档,但默认情况下在帮助文档是在线以网页的形式呈现的,当我们不方便上网时就不能够查看帮助 ...
- fn project Function files 说明
主要是文件 func.yaml func.json 详细说明如下: An example of a function file: name: fnproject/hello version: 0.0. ...
- JAVA框架--hibernate、struts2、spring
JAVAEE——spring01:介绍.搭建.概念.配置详解.属性注入和应用到项目 JAVAEE——struts2_04:自定义拦截器.struts2标签.登陆功能和校验登陆拦截器的实现 JA ...
- 常见26个jquery使用技巧详解
本文列出jquery一些应用小技巧,比如有禁止右键点击.隐藏搜索文本框文 字.在新窗口中打开链接.检测浏览器.预加载图片.页面样式切换.所有列等高.动态控制页面字体大小.获得鼠标指针的X值Y值.验证元 ...
- selenium - 三种元素等待
1.sleep 休眠方法 sleep()由python的time模块提供. 当执行到sleep()方法时,脚本会定时休眠所设置的时长,sleep()方法默认参数是s(秒),sleep(2) 表示休眠2 ...
- path设置
查看 export declare -x HISTCONTROL="ignoredups"declare -x HISTSIZE="1000"declare - ...
- 显示等待 之 text_to_be_present_in_element 判断元素是否有xx 文本信息 用法
- Linux系统层面标配
1.MySQL中出现存SWAP,主要会是哪些原因?--物理内存切实不足--numa导致内存分配不均,出现物理内存未使用完,就出现大量swap的使用 2.MySQ中CPU负载很高,是什么原因?给出查找的 ...
- zabbix的sendEmail配置
zabbix的sendEmail配置 [root@hongquan scripts]# yum install sendmail[root@hongquan soft]# tar xvzf sendE ...