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]\)上课,如果申请换课成功, ...
随机推荐
- Redis设计与实现 (二): 链表
Redis实现为双链表结构, 列表键的底层实现之一就是链表, 发布与订阅, 慢查询, 监视器等功能都用到了链表. Redis本身也使用链表维持多个客户端. 节点定义, 位于 adlist.h/lis ...
- python 使用sk_learn 遇到 问题ValueError: Expected 2D array, got 1D array instead:
这里我找到我的问题是: 使用的是一个新的scikit学习版本,它抛出了一个错误,因为在新版本中,所有东西都必须是一个二维矩阵,甚至是一个列或行. 它甚至说:用数组来重塑你的数据.如果您的数据有一个单独 ...
- #51单片机#8位数码管(74HC595芯片)的使用方法
数码管基本属性:1.采用2片595驱动数码管,需要单片机3路IO口,根据数码管动态扫描原理进行显示:2.宽工作电压3.3V到5V:3.PCB板尺寸:71mm*22mm4.数码管型号:0.36 4位共阳 ...
- 使用pinyin4j汉字转pinyin
引入maven依赖<dependencies> <dependency> <groupId>com.belerweb</groupId> <art ...
- 网络服务器带宽Mbps、Mb/s、MB/s的区别
例如所谓 10M 带宽,其实是指 10Mbps (兆比特) 计算带宽理论最快下载速度:10÷8=1.25MB/s 那么100M的带宽最快下载速度是12.5MB/s. 但这只是理论上的速度,在这个数值附 ...
- 1021. Deepest Root (25)——DFS+并查集
http://pat.zju.edu.cn/contests/pat-a-practise/1021 无环连通图也可以视为一棵树,选定图中任意一点作为根,如果这时候整个树的深度最大,则称其为 deep ...
- delphi2010多线程编程教程
多线程编程(1) - 先入门再说. 多线程应该是编程工作者的基础技能, 但这个基础对我来讲的确有点难(起码昨天以前是这样). 开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解 ...
- Git的其他一些使用案例
按照格式输出提交号 作者 时间 git log --pretty=format:"%h %an %cd" --date=iso 获取所有远程的tag和他的commit sha1 g ...
- Avalon总线概述
Nios系统的所有外设都是通过Avalon总线与Nios CPU相接的,Avalon总线是一种协议较为简单的片内总线,Nios通过Avalon总线与外界进行数据交换. Avalon总线接口分类 可分为 ...
- ATM:模拟实现一个ATM + 购物商城程序
额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还款接口 ATM记录操作日志 提供管理接 ...