C. 连锁商店
time limit per test

1 second

memory limit per test

512 megabytes

input

standard input

output

standard output

比特山是一个旅游胜地,它一共有 n个景点,按照海拔高度从低到高依次编号为 1到 n。为了更好地帮助游客们欣赏这里的风景,人们在上面搭建了 m 条缆车路线。

每条缆车路线只可能把游客们从某个海拔较低的景点运送到另一个海拔较高的景点。

在每个景点都有一家纪念品连锁商店,其中第 i 个景点的商店隶属第 ci 号公司,两家连锁店 (i,j) 隶属同一公司当且仅当 ci=cj。每家公司都有新客优惠活动,其中第i家公司对于新客的优惠红包为 wi 元,

一旦领取了隶属该公司的某家连锁店的一份红包,就不能再领取该公司所有分店的红包。

你正在 1号景点,你将会搭乘缆车去往各个景点,每到一个景点,你都可以领取该景点的连锁商店的新客优惠红包(包括 1 号景点)。当然,同一家公司的红包最多只能领一次。

请写一个程序,对于每个可能的终点 k,找到一条从 1 号景点出发到达 k 号景点的游览路线,使得可以领取到总金额最多的优惠红包。

Example
input

 
5 5
1 2 2 3 4
1 4 5 9 3
1 2
2 3
3 5
1 4
4 5
output

 
1
5
5
6
15

这道题比较关键的就是隶属关系,当我们选则在同一集合内的任意一个之后,其他的红包则不能领取

所以依据这种关系我们可以将这道题看作在不同状态下选择某一个红包,不断在各个状态下更新当前状态下能够获取的红包最大值

建立状压dp,dp[i][j]表示在站点 i 时处于状态 j 下能够获得的最大红包值

这样建立的dp虽然也能运行,但是2^36次着实有点大,容易TLE,所以我们可以对原始的关系进行优化

因为线路在选择时假设我们可以1->2->3->4,和1->4,那我们肯定选择1->2->3->4,这种情况下我们能获得红包的可能是最大的

所以在建图时对此进行优化

 1 # include<iostream>
2 # include<algorithm>
3 # include<cstring>
4 # include<vector>
5 # include<map>
6 # define int long long
7 # define endl "\n"
8 using namespace std;
9 const int N = 2e5 + 10;
10 int a[N], b[N];
11 int ne[N];
12 vector<int> p[60], go[60], zt[60];
13 map<int, int> dp[60];
14 int g[60][60];/*初次存图*/
15 int ans[60];
16 void solve() {
17 int n, m;
18 cin >> n >> m;
19 for (int i = 1; i <= n; ++i) {
20 cin >> a[i];
21 p[a[i]].push_back(i);/*
22 存储隶属关系
23 */
24 }
25 for (int i = 1; i <= n; ++i) {
26 cin >> b[i];/*每个点的红包值*/
27 }
28 for (int i = 1; i <= m; ++i) {
29 int x, y;
30 cin >> x >> y;
31 g[x][y] = 1;/*建图*/
32 }
33 for (int i = 1; i <= n; ++i)
34 for (int j = i + 1; j <= n; ++j)
35 for (int k = i + 1; k <= j; ++k)
36 if (g[i][j] == 1 && g[i][k] == 1 && g[k][j] == 1)
37 g[i][j] = 0;/*优化建图*/
38
39 for (int i = 1; i <= n; ++i)
40 for (int j = i + 1; j <= n; ++j)
41 if (g[i][j]) go[j].push_back(i);/*记录每个点的上一个点*/
42 dp[1][(int)1 << a[1]] = b[a[1]];
43 ans[1] = b[a[1]];
44 zt[1].push_back((int)1 << a[1]);
45
46 for (int i = 2; i <= n; ++i) {
47 int bit = a[i];
48 for (int res : go[i])/*枚举当前节点可以从上一个节点的哪个状态转移来*/
49 for (int s : zt[res]) {/*枚举上一个节点的所有状态*/
50 if (s & (int)1 << bit) {/*如果上一个节点已经路过了*/
51 if (!dp[i].count(s)) {/*当前节点是否存储过当前状态*/
52 dp[i][s] = dp[res][s];
53 zt[i].push_back(s);/*没存储过就存这个状态*/
54 }
55 dp[i][s] = max(dp[i][s], dp[res][s]);/*迭代*/
56 ans[i] = max(ans[i], dp[i][s]);/*更新到达当前节点的最大红包值*/
57 }
58 else{/*若没经过上一个点*/
59 int now = s|(int)1<<bit;/*现在的状态*/
60 if(!dp[i].count(now)){
61 zt[i].push_back(now);
62 }
63 dp[i][now] = max(dp[i][now],dp[res][s]+b[a[i]]);/*如果没经过上一个点那么当前节点就会多一个红包*/
64 ans[i] = max(ans[i],dp[i][now]);
65 }
66 }
67 }
68 for(int i = 1;i <= n;++i) cout<<ans[i]<<endl;
69
70 }
71 int tt;
72 signed main() {
73 ios::sync_with_stdio(false);
74 cin.tie(nullptr);
75 cout.tie(nullptr);
76 tt = 1;
77 while (tt--) {
78 solve();
79 }
80
81
82 return 0;
83 }

C. 连锁商店(状压dp)的更多相关文章

  1. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  2. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  3. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  4. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

  5. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

  6. bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)

    数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...

  7. HDU 1074 Doing Homework (状压dp)

    题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...

  8. 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP

    [BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...

  9. 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP

    [BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...

随机推荐

  1. ubantu安装中文失败的改正方法

    情况说明 一开始我也是像博主们那样安装,但是一直在这个界面安装失败,太悲伤了!! 报错内容 c Failed to fetch http://us.archive.ubuntu.com/ubuntu/ ...

  2. 事物的隔离性和MVCC

    事物的隔离性 mysql的服务端是支持多个客户端同时与之连接的,每个客户端可能还并发了好几个连接,所以mysql是需要同时处理很多事情的,每一件独立的事情就叫做事务.我们知道事务有一个叫隔离性的特性, ...

  3. pathlib路径问题

    下面是我的文件框架 app ------ file1---- .py1 file2---- .py2 config.py 我在config文件中设置了变量参数 BASE_DIR = pathlib.P ...

  4. openstack中Glance组件简解

    一.Glance组件介绍 1.概念 Glance是OpenStack镜像服务,用来注册.登陆和检索虚拟机镜像.Glance服务提供了一个REST API,使你能够查询虚拟机镜像元数据和检索的实际镜像. ...

  5. K8S Pod及其控制器

    Pod K8S里能够运行的最小逻辑单元,1个Pod可以运行多个容器 Pod 控制器 Pod控制器是Pod启动的一种模版,用来保证在K8S中启动的Pod始终按照人们的预期运行(副本数,生命周期.健康状态 ...

  6. 干货分享!JAVA诊断工具Arthas在Rainbond上实践~

    别再担心线上 Java 业务出问题怎么办了,Arthas 帮助你解决以下常见问题: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 ...

  7. Django 简介和版本介绍

    一.简介 官方地址:https://www.djangoproject.com Django 是一个由Python 编写的具有完整架站能力的开源Web框架.使用 Django,只要很少的代码,开发人员 ...

  8. 【ProxySQL】ProxySQL Cluster的搭建

    文章转载自:https://blog.51cto.com/l0vesql/2104643 背景 早期的ProxySQL若需要做高可用,需要搭建两个实例,进行冗余.但两个ProxySQL实例之间的数据并 ...

  9. Helm3 安装 ElasticSearch & Kibana 7.x 版本

    文章转载自:http://www.mydlq.club/article/13/ 系统环境: helm 版本:v3.2.1 Kubernetes 版本:1.18.3 ElasticSearch Char ...

  10. 常见Content-Type(MIME)列表

    Content-Type(MIME)用于标识发送或接收数据的类型,浏览器根据该参数来决定数据的打开方式.多用于指定一些客户端自定义的文件,以及一些媒体文件的打开方式. 文件扩展名 Content-Ty ...