【题目链接】

点击打开链接

【算法】

概率DP

先跑一遍floyed,求出每个教室之间的最短路径,存在数组dist[][]中,时间复杂度O(V^3)

设计状态,f[i][j][k]表示当前选到第i个教室,已经选了j个教室,当前这个教室选不选(0..1)

那么,状态转移方程是什么呢?

假设当前选到第i个教室,已经选了j个教室,那么,如果不选这个教室,则状态转移方程为

f[i][j][0] = max{f[i-1][j][0]+dist[c[i-1]][c[i]],f[i-1][j][1]+dist[c[i-1]][c[i]]*(1-k[i-1])+dist[d[i-1]][c[i]]*k[i-1]}

      如果选这个教室,则状态转移方程是

      f[i][j][1] = min{f[i-1][j-1][0]+dist[c[i-1]][d[i]]*k[i]+dist[c[i-1]][c[i]]*(1-k[i],f[i-1][j-1][1]+dist[d[i-1]][d[i]]*k[i-1]*k[i]+dist[c[i-1]][d[i]]*(1-k[i-1])*k[i]+dist[c[i-1]][c[i]]*(1-k[i-1])*(1-k[i])+dist[d[i-1]][c[i]]*k[i-1]*(1-k[i])}

于是这道题便迎刃而解了!

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN 2000
#define MAXV 300 int i,j,k,n,m,v,e,a,b,w;
int dist[MAXV+][MAXV+],c[MAXN+],d[MAXN+];
double P[MAXN+],dp[MAXN+][MAXN+][];
double ans = 2e9; template <typename T> inline void read(T &x) {
int f=; x=;
char c = getchar();
for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
for (; isdigit(c); c = getchar()) x = x * + c - '';
x *= f;
} template <typename T> inline void write(T x) {
if (x < ) { putchar('-'); x = -x; }
if (x > ) write(x/);
putchar(x%+'');
} template <typename T> inline void writeln(T x) {
write(x);
puts("");
} int main() { read(n); read(m); read(v); read(e);
for (i = ; i <= v; i++) {
for (j = ; j <= v; j++) {
if (i != j)
dist[i][j] = 2e9;
}
}
for (i = ; i <= n; i++) read(c[i]);
for (i = ; i <= n; i++) read(d[i]);
for (i = ; i <= n; i++) cin >> P[i];
for (i = ; i <= e; i++) {
read(a); read(b); read(w);
dist[a][b] = min(dist[a][b],w);
dist[b][a] = min(dist[b][a],w);
} for (k = ; k <= v; k++) {
for (i = ; i <= v; i++) {
if (i == k) continue;
if (dist[i][k] == 2e9) continue;
for (j = ; j <= v; j++) {
if (dist[k][j] == 2e9) continue;
if ((i == j) || (k == j)) continue;
dist[i][j] = min(dist[i][j],dist[i][k]+dist[k][j]);
}
}
} for (i = ; i <= n; i++) {
for (j = ; j <= m; j++) {
dp[i][j][] = dp[i][j][] = 2e9;
}
} dp[][][] = ; dp[][][] = ;
for (i = ; i <= n; i++) {
dp[i][][] = dp[i-][][] + dist[c[i-]][c[i]];
for (j = ; j <= min(i,m); j++) {
dp[i][j][] = min(dp[i-][j][]+dist[c[i-]][c[i]],dp[i-][j][]+dist[c[i-]][c[i]]*(1.0-P[i-])+dist[d[i-]][c[i]]*P[i-]);
dp[i][j][] = min(dp[i-][j-][]+dist[c[i-]][d[i]]*P[i]*1.0+dist[c[i-]][c[i]]*(1.0-P[i]),
dp[i-][j-][]+
dist[d[i-]][d[i]]*P[i-]*P[i]*1.0+
dist[c[i-]][d[i]]*(1.0-P[i-])*P[i]+
dist[c[i-]][c[i]]*(1.0-P[i-])*(1.0-P[i])+
dist[d[i-]][c[i]]*P[i-]*(-P[i])*1.0);
}
} for (i = ; i <= m; i++) ans = min(ans,min(dp[n][i][],dp[n][i][]));
cout<< fixed << setprecision() << ans << endl; return ; }

最新文章

  1. react 犯错
  2. 关于内存的5个函数(malloc,VirtualAlloc,GlobalAlloc,LocalAlloc,HeapAlloc)
  3. CURL 多线程问题
  4. .net 生成pdf表格
  5. 单/多行文本添加省略号 (o゚ω゚o)
  6. Window2003、xp远程备份数据库文件(xcopy+rar+pscp)
  7. Asp.net MVC4高级编程学习笔记-模型学习第五课MVC表单和HTML辅助方法20171101
  8. backface-visibility 3D修复
  9. [HackerRank]New Year Chaos[UNDONE]
  10. 常用Docker命令
  11. Spring乱码问题解决方案
  12. .NetCore 下开发独立的(RPL)含有界面的组件包 (五)授权过滤参数处理
  13. Xamarin SQLite教程数据库访问与生成
  14. Spring Cloud Ribbon入门
  15. day3 反射与动态代理
  16. VirtualBox如何扩展虚拟机Ubuntu的硬盘容量?
  17. 2018.07.23 洛谷P4513 小白逛公园(线段树)
  18. B. A Leapfrog in the Array
  19. 缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename
  20. SHUOJ - 算法题1 矩阵连乘问题(区间dp)

热门文章

  1. python判断一个字符串是否是小数
  2. Java Socket应用
  3. 新建JRapid项目(idea创建maven多模块项目)
  4. amplab
  5. 数字巨头们的表态--&lt;大佬与大话&gt;
  6. sklearn 特征选择
  7. BUPT复试专题—最近公共祖先(2014软院)
  8. Deleting array elements in JavaScript - delete vs splice
  9. App反编译二次打包常见问题处理
  10. MVC Page分页控件