链接:https://ac.nowcoder.com/acm/contest/134/D
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

今天春天铁子的班上组织了一场春游,在铁子的城市里有n个郊区和m条无向道路,第i条道路连接郊区Ai和Bi,路费是Ci。经过铁子和顺溜的提议,他们决定去其中的R个郊区玩耍(不考虑玩耍的顺序),但是由于他们的班费紧张,所以需要找到一条旅游路线使得他们的花费最少,假设他们制定的旅游路线为V1, V2 ,V3 ... VR,那么他们的总花费为从V1到V2的花费加上V2到V3的花费依次类推,注意从铁子班上到V1的花费和从VR到铁子班上的花费是不需要考虑的,因为这两段花费由学校报销而且我们也不打算告诉你铁子学校的位置。

输入描述:

第一行三个整数n, m, R(2 ≤ n ≤ 200, 1 ≤ m ≤ 5000, 2 ≤ R ≤ min(n, 15))。
第二行R个整数表示需要去玩耍的郊区编号。
以下m行每行Ai, Bi, Ci(1 ≤ Ai, Bi ≤ n, Ai ≠ Bi, Ci ≤ 10000)
保证不存在重边。

输出描述:

输出一行表示最小的花费

示例1

输入

4 6 3
2 3 4
1 2 4
2 3 3
4 3 1
1 4 1
4 2 2
3 1 6

输出

3

解析:

先用floyd求出各城市之间的最短距离

状压dp解决,遍历从去过的地方去没去过的地方

dp[i][j]表示路径状态i,当前在j城市,  从j->k   =>    dp[i][j]->dp[i+(1<<k)][k]

dp[i+(1<<k)][k]等价于dp[i|(1<<k)][k]

ac:

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAXN 205
using namespace std;
int R[MAXN];
int dis[MAXN][MAXN];
int dp[1<<16][20];//二进制保存的已到的地方,并且保存结束位置int main()
{memset(dp,inf,sizeof(dp));memset(dis,inf,sizeof(dis));int n,m,r,u,v,w;scanf("%d%d%d",&n,&m,&r);for(int i=1;i<=r;i++)scanf("%d",&R[i]);for(int i=1;i<=m;i++)scanf("%d%d%d",&u,&v,&w),dis[u][v]=w,dis[v][u]=w;for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);for(int i=1;i<=r;i++)dp[1<<(i-1)][i]=0;int len=(1<<r)-1;for(int i=1;i<len;i++)//枚举状态{for(int j=1;j<=r;j++)//枚举开始位置的状态{int s=(1<<(j-1));if((i&s)==0)continue;for(int k=1;k<=r;k++)//枚举结束位置的状态{int t=(1<<(k-1));if((i&t)!=0)continue;dp[i+t][k]=min(dp[i+t][k],dp[i][j]+dis[R[j]][R[k]]);}}}int ans=1e9;for(int i=1;i<=r;i++)ans=min(ans,dp[len][i]);printf("%d\n",ans);return 0;
}

G1 - Playlist for Polycarp (easy version)

题意:

有n首歌

选择若干的歌,使得总时间为T

选择的歌按顺序听,相邻的歌不可以是同类型,歌曲不能重复

问有多少种听歌顺序

解析:

基础状压dp

ac:

#include<bits/stdc++.h>
#define MAXN 20
#define mod 1000000007
#define v(x)  (1<<x)
#define ll long long
using namespace std;
ll dp[1<<16][4],sum[1<<16];
int t[MAXN],g[MAXN];int main()
{int n,T;scanf("%d%d",&n,&T);for(int i=1;i<=n;i++)scanf("%d%d",&t[i],&g[i]);int len=v(n)-1;//计算i状态下的歌曲时间和for(int i=1;i<=len;i++){for(int j=1;j<=n;j++){int k=v(j-1);if((i&k)){sum[i]+=t[j];}}}dp[0][0]=1;//计算不同组合类型for(int i=0;i<len;i++){for(int j=0;j<=3;j++){if(i!=0&&j==0)continue;for(int k=1;k<=n;k++){int v=v(k-1);if(i&(v))//已经包含了第k首歌continue;if(sum[i+v]>T||g[k]==j)//时间和>T,同类型相邻continue;dp[i+v][g[k]]=(dp[i+v][g[k]]+dp[i][j])%mod;}}}ll ans=0;for(int i=0;i<=len;i++){if(sum[i]==T){//要算三种类型for(int j=1;j<=3;j++)ans=(ans+dp[i][j])%mod;}}printf("%lld\n",ans);return 0;
}

郊区春游(状压dp)相关推荐

  1. 牛客 郊区春游 状压+最短路

    题目链接:郊区春游 思路:首先先用floyd求一下各个点之间的最短路,那么接下来就是找出一条最短路将R个点串起来.最简单的就是枚举每一种排列然后求最小值,那么时间复杂度就是15!,也就是1307674 ...

  2. 牛客网 小白月赛4 D-郊区春游 最短路+状压dp

    链接: https://www.nowcoder.com/acm/contest/134/D来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  3. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  4. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  5. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  6. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  7. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  8. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  9. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

最新文章

  1. 敏捷软件开发--计划
  2. Win Server 2008中开启Areo特效
  3. 软件项目周报_软件产品研发流程
  4. Scrapy-redis实现分布式爬取的过程与原理
  5. EXT.NET 更改lable和Text的颜色
  6. matlab fig生成exe,MATLAB GUI多个m文件和fig如何生成exe文件
  7. 斐波那契数列(信息学奥赛一本通-T1159)
  8. FPGA学习笔记---3种乘法器的比较
  9. jeecg3.8popup弹出窗口触发失去焦点事件,引发验证弹窗,影响体验问题的解决办法
  10. python 排序统计滤波器_数字图像处理的python实现(8)——中值滤波
  11. silverlight异常
  12. Linkage 使用方法总结
  13. Android环绕地球动画,手机也能带你进入360°全景立体影音世界?---杜比全景声体验全接触...
  14. 如何在Microsoft Excel电子表格之间交叉引用单元格
  15. 小程序数据监测工具分析
  16. Bluetooth 5 新功能概述
  17. Kubernetes 亲和性与反亲和性
  18. “JEPG”到“TXT”,魔幻的Loot
  19. DOC文档转换成WPS格式要怎样操作
  20. 女神节送什么给礼物女友好,2022女神节送礼合集

热门文章

  1. PyCharm使用技巧:Shift + Tab(向左缩进)
  2. 获取手机唯一识别码IMEI
  3. C语言实现RGB888转BMP格式图片功能
  4. Nodejs (一)
  5. simulink模块名称显示设置_simulink模块名称继承
  6. java,NIO,UDP协议网络通信DEMO
  7. ffmpeg 命令 监控屏幕,摄像头 udp推流 收流 。 包括低延迟处理
  8. 35 个提高千倍效率的 Java 代码小技巧
  9. 使用Python+Opencv+Flask将windows端的摄像头变为网络摄像头的方法
  10. PX4使用手册-自主避障-ObstacleAvoidance