哇好开心啊!写的时候真的全然对于这个加法没有把握,但还是大着胆子试着写了一下——竟然过了样例?于是又调了一下就过啦。

不过想想也觉得是正确的吧,互相独立的事件对于期望的影响自然也是相互独立的,可以把所有的情况看成一个整体,不同的统计方式只是分组的区别,最后算出来的答案肯定是一样的。dp的状态比较显然:dp[i][j][0/1]代表当前在第i节课,已经用去了j次申请的机会,0/1分别代表当前这一节课是否申请。那么这个时候就分情况讨论,计算这一次的选择对于答案的影响。

这些不同的情况分别是:当前和上一次是否选择申请换课,申请换课的是否成功。

期望的计算式:成功的概率*成功的代价+失败的概率*失败的代价。

#include <bits/stdc++.h>
using namespace std;
#define maxn 2050
#define INF 1047483640
#define maxm 2050
#define maxv 400
int n, m, v, e, dis[maxv][maxv], c[maxn], d[maxn];
double ans = , dp[maxn][maxm][], k[maxn]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void init()
{
for(int i = ; i <= v; i ++)
for(int j = i + ; j <= v; j ++)
dis[i][j] = dis[j][i] = INF; for(int i = ; i <= n; i ++)
for(int j = ; j <= m; j ++)
dp[i][j][] = dp[i][j][] = INF;
} double gmin(double &x, double y)
{
x = (x < y) ? x : y;
} int gmin2(int &x, int y)
{
x = (x < y) ? x : y;
} void Floyd()
{
for(int k = ; k <= v; k ++)
for(int i = ; i <= v; i ++)
for(int j = ; j <= v; j ++)
gmin2(dis[i][j], dis[i][k] + dis[k][j]);
} int main()
{
n = read(), m = read(), v= read(), e = read();
for(int i = ; i <= n; i ++) c[i] = read();
for(int i = ; i <= n; i ++) d[i] = read();
init();
dp[][][] = dp[][][] = ;
for(int i = ; i <= n; i ++) scanf("%lf", &k[i]);
for(int i = ; i <= e; i ++)
{
int x = read(), y = read(), z = read();
dis[x][y] = dis[y][x] = min(dis[y][x], z);
}
for(int i = ; i <= v; i ++) dis[i][i] = ;
Floyd();
for(int i = ; i <= v; i ++)
dis[i][] = dis[][i] = ;
c[] = d[] = , k[] = ;
for(int i = ; i <= n; i ++)
for(int j = ; j <= m; j ++)
{
gmin(dp[i][j][], dp[i - ][j][] + dis[c[i]][c[i - ]]);
gmin(dp[i][j][], dp[i - ][j][] + dis[c[i]][c[i - ]] * ( - k[i - ]) + dis[c[i]][d[i - ]] * k[i - ]);
if(j) gmin(dp[i][j][], dp[i - ][j - ][] + dis[c[i]][c[i - ]] * ( - k[i]) + dis[d[i]][c[i - ]] * k[i]);
double tem = ;
tem += dis[c[i]][c[i - ]] * ( - k[i]) * ( - k[i - ]);
tem += dis[c[i]][d[i - ]] * ( - k[i]) * k[i - ];
tem += dis[d[i]][c[i - ]] * k[i] * ( - k[i - ]);
tem += dis[d[i]][d[i - ]] * k[i] * k[i - ];
if(j) gmin(dp[i][j][], dp[i - ][j - ][] + tem);
}
for(int i = ; i <= m; i ++)
gmin(ans, min(dp[n][i][], dp[n][i][]));
printf("%.2lf", ans);
return ;
}

最新文章

  1. 各大IT技术博客排行榜
  2. Akka: actor应用的一些小结
  3. [Tools] Eclipse更改类注释自动生成模板
  4. 【Merge Sorted Array】cpp
  5. Xcode6编译SDWebImage报错解决方法(SDWebImageDownloaderOperation.m错误)
  6. Codeforces Round #276 (Div. 1) A. Bits 二进制 贪心
  7. POJ 1273 || HDU 1532 Drainage Ditches (最大流模型)
  8. Xcode5最初级的教程
  9. eclipse配置tomcat及修改tomcat默认根目录
  10. pycharm5工具免费分享及安装教程
  11. windows环境中利用NMake工具编译连接C++源代码
  12. R语言学习笔记︱Echarts与R的可视化包——地区地图
  13. linux2.6硬盘扇区直接读写程序
  14. link-cut-tree 简单介绍
  15. RESTful规范建议
  16. eclipse svn 删除不了项目,合并不了问题
  17. 音视频编解码——RGB与YUV格式转换
  18. 用swagger生成接口文档代码
  19. Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)
  20. Netty 中 IOException: Connection reset by peer 与 java.nio.channels.ClosedChannelException: null

热门文章

  1. React中的全选反选问题
  2. Java : java基础(2) 集合&amp;正则&amp;异常&amp;File类
  3. 用状态机表示SFC中的并行分支
  4. CSS 转载
  5. 什么是高防服务器?如何搭建DDOS流量攻击防护系统
  6. ubuntu配置机器学习环境(一) ubuntu安装
  7. pxe无人值守安装linux机器笔记----摘抄
  8. android开发过程中项目中遇到的坑----布点问题
  9. 使用FPGA开发板驱动VGA显示器
  10. Python 3基础教程27-字典