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]\)上课,如果申请换课成功, ...
随机推荐
- 【转】C# Socket编程(3)编码和解码
[转自:https://www.cnblogs.com/IPrograming/archive/2012/10/13/CSharp_Socket_3.html] 在网络通信中,很多情况下:比如说QQ聊 ...
- javascript:;与javascript:void(0)
如果想做一个链接点击后不做任何事情,或者响应点击而完成其他事情,可以设置其属性 href = "#",但是,这样会有一个问题,就是当页面有滚动条时,点击后会返回到页面顶端,用户体验 ...
- Six Basic Functional Areas of Spring
- ReactJS开发环境搭建与相关工具介绍
现在Web开发的技术几年前相比可谓变化之大.各种各样的框架,各种各样的工具,让Web开发效率更高,开发出来的效果更好.同时带来的是开发环境的复杂度相比以前是成倍的增加.ReatJS框架是现在比较流行的 ...
- 不让activity显示UI的办法
直接把 //setContentView(R.layout.activity_welcome); 注释掉就是了
- git 统计命令
git log --author='user' --pretty=tformat: --numstat --since='2018-01-01' --before='2018-10-10' | gaw ...
- C 游戏所要看的书
C 游戏所要看的书 1.C++primer中文版第4版 经典啊2.C++标准程序库自修教程与参考手册 3.Windows程序设计第5版 4.MFC windows程序设计第2版中文版 5.VC ...
- java代码关于匿名内部类和接口的方法使用
总结:主要是多个按钮实现监听时,能够响应不同的事件 以上步骤我们可以用多种方法实现.但人们通常用二种方法.第一种方法是只利用一个监听器以及多个if语句来决定是哪个组件产生的事件:第二种方法是使用多个内 ...
- NOIP2005普及组第4题 循环
NOIP2005普及组第4题 循环 时间限制: 1 Sec 内存限制: 128 MB提交: 27 解决: 6[提交][状态][讨论版][命题人:外部导入] 题目描述 乐乐是一个聪明而又勤奋好学的孩 ...
- IntelliJ IDEA中如何设置忽略@param注释中的参数与方法中的参数列表不一致的检查