由于n较大,可以将n个数中的关系对数量记录在$m*m$的矩阵中,记作$a[i][j]$
考虑朴素的状压dp枚举排列,即$f[i]$表示以i中的数的一种排列为整个序列的前缀的最小代价,然后转移枚举下一个数j以及与其相关的数k,那么有转移$f[i|j]=\min(f[i]+(|i|+1)(\sum_{k\in i}\limits (t\cdot a[j][k]+a[k][j])+\sum_{k\notin i}\limits (t\cdot a[k][j]-a[j][k])))$,时间复杂度为$o(m^{2}\cdot 2^{m})$
对时间优化,对于一个i,需要快速求出下一个数为j时$|i|+1$的系数,设为$g[i][j]$,考虑从$i-lowbit(i)$转移,那么有转移$g[i][j]=g[i-k][j]+t\cdot a[j][k]+a[k][j]-(t\cdot a[k][j]-a[j][k])$,其中$k=lowbit(i)$,时间复杂度降为$o(m\cdot 2^{m})$,但空间复杂度变为$o(m\cdot 2^{m})$
对空间优化,有一个十分巧妙的做法:考虑g中修改1位的复杂度为$o(m)$,同时由于对0不断高精度+1加到$2^m$复杂度均摊$o(1)$,那么从小到大枚举i并对g暴力修改即可,时间复杂度不变,空间复杂度降为$o(2^{m}+m)$

 1 #include<bits/stdc++.h>
2 using namespace std;
3 int n,m,t,x,y,a[105][105],f[10000005],g[105];
4 int main(){
5 scanf("%d%d%d",&m,&n,&t);
6 for(int i=1;i<=m;i++){
7 scanf("%d",&y);
8 y--;
9 if (i>1)a[x][y]++;
10 x=y;
11 }
12 for(int i=0;i<n;i++)a[i][i]=0;
13 memset(f,0x3f,sizeof(f));
14 f[0]=0;
15 for(int i=0;i<(1<<n);i++){
16 int s=1,l=i-(i&(i-1));
17 for(int j=0;j<n;j++)s+=((i&(1<<j))>0);
18 for(int j=0;(1<<j)<=l;j++)
19 for(int k=0;k<n;k++)
20 g[k]=g[k]+(t*a[k][j]+a[j][k]+a[k][j]-t*a[j][k])*(1-2*((1<<j)<l));
21 if (!l)l=(1<<n);
22 for(int j=0;(1<<j)<=l;j++){
23 g[j]=0;
24 if ((1<<j)<l)
25 for(int k=0;k<n;k++)
26 if ((i&(1<<k))==0)g[j]+=t*a[k][j]-a[j][k];
27 else g[j]+=t*a[j][k]+a[k][j];
28 }
29 for(int j=0;j<n;j++)
30 if ((i&(1<<j))==0)f[i|(1<<j)]=min(f[i|(1<<j)],f[i]+s*g[j]);
31 }
32 printf("%d",f[(1<<n)-1]);
33 }

[loj3302]信号传递的更多相关文章

  1. 题解 P6622 [省选联考 2020 A/B 卷] 信号传递

    洛谷 P6622 [省选联考 2020 A/B 卷] 信号传递 题解 某次模拟赛的T2,考场上懒得想正解 (其实是不会QAQ), 打了个暴力就骗了\(30pts\) 就火速溜了,参考了一下某位强者的题 ...

  2. luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)

    luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp) Luogu 题外话: 我可能是傻逼, 但不管我是不是傻逼, 我永远单挑出题人. 题解时间 看数据范围可以确定状压dp. ...

  3. linux 多线程之间信号传递

    函数 sigwait sigwait的含义就如同它的字面意思:等待某个信号的到来.如果调用该函数的线程没有等到它想等待的信号那么该线程就休眠.要达到等到一个信号,我们得做下面的事: 首先,定义一个信号 ...

  4. heoi2020信号传递

    状压dp 我状压学得是真烂..... 考试的时候想了状压,可是一直都是在枚举位置,没有神魔实质性突破.其实这道题的关键瓶颈也在于此,状压压的是号,而不是位置.如果 $i<=j$ 那么贡献为 $j ...

  5. P6622 信号传递 做题感想

    题目链接 前言 在这里分享两种的做法. 一种是我第一直觉的 模拟退火.(也就是骗分) 还有一种是看题解才搞懂的神仙折半搜索加上 dp . 模拟退火 众所周知,模拟退火 是我这种没脑子选手用来骗分的好算 ...

  6. Android面试题(一)

    1. 请描述一下Activity 生命周期. 答: 如下图所示.共有七个周期函数,按顺序分别是: onCreate(), onStart(), onRestart(), onResume(), onP ...

  7. 最快让你上手ReactiveCocoa之基础篇

    前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,这里介绍一下. 1.Rea ...

  8. Altium Designer 的entry sheet ,offsheet和port作用(转载)

    1.图纸结构 图纸包括两种结构关系: 一种是层次式图纸,该连接关系是纵向的,也就是某一层次的图纸只能和相邻的上级或下级有关系: 另一种是扁平式图纸,该连接关系是横向的,任何两张图纸之间都可以建立信号连 ...

  9. Docker Volume 之权限管理(转)

    Volume数据卷是Docker的一个重要概念.数据卷是可供一个或多个容器使用的特殊目录,可以为容器应用存储提供有价值的特性: 持久化数据与容器的生命周期解耦:在容器删除之后数据卷中的内容可以保持.D ...

随机推荐

  1. 学习笔记——不带修序列莫队 (luogu2079)小B的询问

    莫队是一种对于询问的离线算法 时间复杂度:O(\(n \sqrt n\)) 大致思想就是 首先将询问离线,然后对原序列分块,使得每一个\(l和r\)都在一个块里 然后按照左节点排序,若所在的块相等,就 ...

  2. ArrayList-源码分析-自动扩容机制

    ArrayList类: public class ArrayList....{ ...... private static final int DEFAULT_CAPACITY = 10; //默认容 ...

  3. jenkins+allure中测试包括为空,没有数据

  4. windows右键菜单自动打包发布nuget,没有CI/CD一样方便!

    构建现代的 .Net 应用离不开 Nuget 的支持,而快速打包 Nuget 成了提高生产率的有效方法.没有CI/CD?来试试使用windows右键菜单吧 先看右键效果图 有时候我们可能没有CI/CD ...

  5. 网页常用的css特效让互动留住客户

    一般网站如果制作按钮,多做一些互动,可以让客户获得更好的体验. 例如鼠标滑过按钮,让背景颜色从左往右滑出来(或者从右往左都可以): <a target="_blank" hr ...

  6. 12. 亿级流量电商系统JVM模型参数二次优化

    亿级流量电商系统JVM模型参数预估方案,在原来的基础上采用ParNew+CMS垃圾收集器 一.亿级流量分析及jvm参数设置 1. 需求分析 大促在即,拥有亿级流量的电商平台开发了一个订单系统,我们应该 ...

  7. LeetCode:并查集

    并查集 这部分主要是学习了 labuladong 公众号中对于并查集的讲解,文章链接如下: Union-Find 并查集算法详解 Union-Find 算法怎么应用? 概述 并查集用于解决图论中「动态 ...

  8. UltraSoft - Beta - 测试报告

    UltraSoft - Beta - 测试报告 在测试过程中发现了多少Bug?有哪些是Beta阶段的新Bug?有哪些是Alpha阶段没有发现的Bug? 很多Bug在开发阶段就已经经过测试了,我们在Be ...

  9. 计算机网络之网络层路由选择协议(自治系统AS、RIP、OSPF、BGP)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105313629 学习课程:<2019王道考研计算机网络> 学习目的 ...

  10. 注意 .NET string.GetHashCode() 用法

    需求案例:需要把字符串存入数据库,并且要求数据库中不能有重复的字符串,由此就引出了将字符串hash成特定的hash值,依靠查询hash值是否重复来判断字符串是否重复.这样做的好处在于查询重复字符串的代 ...