给出N个点,第一个点是裁判,其他N-1个点需要裁判过去回答问题,每个点需要的时间不一样,而每个裁判最多能回答M分钟的问题。题目分两问,第一问是如何分配可以使使用的裁判数最少,第二问是如何分配裁判,使裁判走过的总路程和最少,裁判一开始都在1,最终也要回到1。

  至于第一问,用一个状态标记已经回答过的人,并用两个数组存回答这些人问题需要的最小裁判数以及裁判数最少时最后一个裁判的剩余时间,然后用类似哈密顿回路形式DP求解就可以了。

  第二问,是MTSP(多旅行商)问题,先求出裁判走过每个集合最终回到起点所需走的路程,然后DP合并环即可。比如1~3三个点,裁判在1,那答案就是Min(1->2->3->1,1->2->1 + 1->3->1)。

  另外,样例数据中有中文空格,真坑!

  

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <math.h>
 5 #define INF 0x3f3f3f3f
 6 #define MAXN 70000
 7 int n,m,xi[20],yi[20],ci[20];
 8 int d1[MAXN],d2[MAXN],dp[MAXN][16];
 9 int tm[MAXN],map[16][16];
10 //DP最少需要的教练数;d1和d2分别代表当前用的教练数以及最后一个教练所剩的时间
11 //每次决策选择最优的决策
12 int dpa(){
13     memset(d1,0x3f,sizeof d1);
14     int full=1<<(n-1);
15     d1[0]=d2[0]=0;
16     for(int st=0;st<full;st++){
17         for(int i=0;i<n;i++){
18             if((st>>i&1)||m<ci[i])continue;
19             int nd1=d1[st],nd2=d2[st];
20             nd2>=ci[i]?(nd2-=ci[i]):(nd1++,nd2=m-ci[i]);
21             if(nd1<d1[st|1<<i]||nd1==d1[st|1<<i]&&nd2>d2[st|1<<i])
22                 d1[st|1<<i]=nd1,d2[st|1<<i]=nd2;
23         }
24     }
25     return d1[full-1]==INF?-1:d1[full-1];
26 }
27 inline int sqr(int x){return x*x;}
28 inline int dis(int i,int j){
29     return ceil(sqrt((double)sqr(xi[i]-xi[j])+sqr(yi[i]-yi[j])));
30 }
31 //求MTSP
32 int dpb(){
33     int full=1<<n;
34     //初始化一个集合所需的时间以及距离等
35     for(int i=0;i<n;i++)
36         for(int j=0;j<n;j++)
37             map[i][j]=dis(i,j);
38     for(int i=0;i<n;i++)tm[1<<i]=ci[i];
39     for(int i=0;i<full;i++)tm[i]=tm[i&(i-1)]+tm[i&-i];
40     //TSP,为了方便直接把最后一个状态加入,最后dp[n][i]即为状态i走了一圈的值
41     memset(dp,0x3f,sizeof dp);
42     dp[0][n-1]=0;
43     for(int st=0;st<full;st++){
44         for(int i=0;i<n;i++){
45             if(dp[st][i]==INF)continue;
46             for(int j=0;j<n;j++){
47                 if((st>>j)&1)continue;
48                 if(tm[st|1<<j]<=m&&dp[st|1<<j][j]>dp[st][i]+map[i][j]){
49                     dp[st|1<<j][j]=dp[st][i]+map[i][j];
50                 }
51             }
52         }
53     }
54     //去掉高位的1来正常合并
55     for(int i=0;i<full;i++)d1[i]=dp[i^(1<<(n-1))][n-1];
56     full>>=1;
57     //区间合并,1个MTSP可能由多个TSP组成
58     for(int st=0;st<full;st++)
59         for(int x=st;x;x=st&(x-1))
60             d1[st]=std::min(d1[st],d1[x]+d1[st^x]);
61     return d1[full-1]==INF?-1:d1[full-1];
62 }
63 int main(){
64     //freopen("test.in","rb",stdin);
65     while(scanf("%d%d",&n,&m)!=EOF){
66         scanf("%d%d",&xi[n-1],&yi[n-1]);
67         for(int i=0;i<n-1;i++)scanf("%d%d",&xi[i],&yi[i]);
68         scanf("%d",&ci[n-1]);
69         for(int i=0;i<n-1;i++)scanf("%d",&ci[i]);
70         int ans=dpa();
71         if(ans==-1)printf("-1 -1\n");
72         else printf("%d %d\n",ans,dpb());
73     }
74     return 0;
75 }

转载于:https://www.cnblogs.com/swm8023/archive/2012/09/14/2684525.html

HDU 4281 Judges' response [MTSP]相关推荐

  1. D(背)P(包)专题

    D(背)P(包)专题 标签(空格分隔): ACM DP 干货 ​ ShengRang && Thea.R ​ 2016.07.11 D背P包专题 01背包 POJ 2923 Reloc ...

  2. 暑假N天乐 —— 01背包及变形

    暑假集训的第一天 第二天了. 决定还是先把基础巩固一下好了,万一后面训练赛出事故更尴尬. 所以今天的主题是 -- 01背包及变形 动态规划概念 动态规划(Dynamic programming,DP) ...

  3. 动态规划总结与题目分类

    源博客链接:http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少 ...

  4. 『ACM-算法-动态规划』初识DP动态规划算法

    一.多阶段决策过程的最优化问题 在现实生活中,有类活 动的过程,由于 它的特殊性,可将过程分成若干个互相阶段.在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.当阶段决策的选取不是任意确 ...

  5. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  6. 《动态规划》— 动态规划分类

    动态规划(英语:Dynamic programming,DP)是一种在数学.计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最 ...

  7. 转:动态规划题目分类

    https://blog.csdn.net/cc_again/article/details/25866971 一.简单基础dp 这类dp主要是一些状态比较容易表示,转移方程比较好想,问题比较基本常见 ...

  8. 【DP专辑】ACM动态规划总结

    转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 ...

  9. ACM比赛经验、刷题记录及模板库总结(更新中)

    前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...

最新文章

  1. 基于javaGUI的文档识别工具制作
  2. struct发送与显示中文
  3. UVa 311 - Packets
  4. 【题解】 hdu2955 Robberies
  5. Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)
  6. 基本select语句的生命周期
  7. 【暴力】Codeforces Round #398 (Div. 2) A. Snacktower
  8. c语言 java 性能 测试_这个蓝桥杯系统的题,用c语言去评测是满分,改为Java说运行错误是0分,但是我查看输入输出,至少第...
  9. Paint X for Mac的用法
  10. android webview 长按复制,Android webview 点击或长按有蒙层 – 热爱改变生活
  11. Intel 64/x86_64/IA-32/x86处理器 - 指令格式(1) - 概述
  12. WPF学习笔记——在“System.Windows.StaticResourceExtension”上提供值时引发了异常
  13. Apache Log4j2 远程代码执行高危漏洞 解决方案
  14. 中文分词的python实现----HMM、FMM
  15. Jquery 使用niceScroll.js 插件
  16. excel 通用进销存(由excel+VBA+MSSQL制作)
  17. HTTP请求中文乱码解决办法
  18. 服务器整体爆率如何修改,传奇服务端gom引擎提升爆率脚本
  19. 怎么用u盘装红帽linux系统,如何使用U盘安装RedHat Linux系统?
  20. S@Kura的PHP进阶之路(五)

热门文章

  1. 异常与锁的释放(synchronized )
  2. bean定义的继承 - Spring Framework reference 2.0.5 参考手册中文版
  3. [Java] Welcome to Artifactory 使用说明
  4. 为什么都说猫有九条命呢
  5. 圣迪奥康扉多功能防辐射卡
  6. 使用PreloadJS加载图片资源
  7. ssh密钥分发与ansible
  8. 使用Eclipsephp工具打开Thinkphp为什么会有红色的波浪线报警?
  9. 关于“SEO五条金律”的解说
  10. Apache+Tomcat中支持“UTF-8”编码的中文地址