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. 免杀手法-tcp套字节传递shellcode学习

    免杀手法-tcp套字节传递shellcode学习

  2. java代码审计的点

    java代码审计的点 组件的审计 首先看pom.xml查看第三方组件和第三方组件的版本 常用的第三方组件: 第三方组件 漏洞类型 组件漏洞版本 log4j2 远程代码执行 Apache log4j2 ...

  3. 大家都能看得懂的源码之 ahooks useVirtualList 封装虚拟滚动列表

    本文是深入浅出 ahooks 源码系列文章的第十八篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 简介 提供虚拟化列表能力的 Hook,用于解决展示海量数据渲染时 ...

  4. QT学习(四)----360界面制作(1)

    参照网上的资料,模仿了一份360新特效的界面. 源代码在:http://download.csdn.net/detail/zhangyang1990828/5238013 360真实效果:(最好自己打 ...

  5. Mysql 安全加固经验总结

    本文为博主原创,转载请注明出处: 目录 1.内网部署Mysql 2. 使用独立用户运行msyql 3.为不同业务创建不同的用户,并设置不同的密钥 4.指定mysql可访问用户ip和权限 5. 防sql ...

  6. Java的线程状态

    在我们平时写code的时候,经常会使用到多线程.其中线程所处的状态就是我们需要进程思考的问题. 线程有哪些状态 NEW: 一个线程刚被创建,但是没有被使用就是处于这个状态 RUNNABLE: 一个线程 ...

  7. 云原生之旅 - 2)Docker 容器化你的应用

    前言 上文中我们用Golang写了一个HTTP server,本篇文章我们讲述如何容器化这个应用,为后续部署到kubernetes 做准备. 关键词:Docker, Containerization, ...

  8. Kubernetes(K8S)特性有哪些?

    Kubernetes简介 Kubernetes是一个开源的,用于管理云平台中做个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单且高效,Kubernetes提供了应用部署,规划 ...

  9. Mybatis框架搭建

    Mybatis框架搭建 思路: 搭建环境 导入Mybatis 编写代码 测试 一.搭建环境 创建数据库 /* Navicat Premium Data Transfer​ Source Server ...

  10. 【疑难杂症】if __name__ == '__main__'的理解

    今天进行小批量梯度下降时,代码给我报错,具体代码如下 import torch import numpy as np from torch.utils.data import Dataset from ...