【算法】状压DP-1

状压DP

    • 介绍
      • 介绍
      • 例子
  • 剖析
    • P4802 [CCO2015] 路短最
      • 题目描述
      • 输入格式
      • 输出格式
      • 样例 #1
        • 样例输入 #1
        • 样例输出 #1
      • 提示
    • 分析
    • Code

介绍

介绍

状态压缩就是使用某种方法,简明扼要地以最小代价来表示某种状态,通常是用一串01数字(二进制数)来表示各个点的状态。这就要求使用状态压缩的对象的点的状态必须只有两种,0 或 1;当然如果有三种状态用三进制来表示也未尝不可。
状态压缩DP:顾名思义,就是用状态压缩实现DP

状压DP主要分为集合式和棋盘式,本文只讨论集合式。

例子

n n n 件物品和一个容量为 V V V 的背包。放入第i件物品的占的空间为 w i w_i wi,得到的价值是 v i v_i vi;求解每种放法的背包价值;

我们考虑用状态压缩。
显然,对于 n n n 件物品,每件物品选或不选分别用 0 0 0 1 1 1 表示,那么 n n n 件物品的状态就可以用一个 n n n 位的二进制数确定。

举个例子:假设当前枚举的状态为 10100 10100 10100,那么空间和价值都可以从状态 00100 00100 00100 10000 10000 10000 推过去。
所以可以有此代码:

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL);
using namespace std;
const int N=1<<13;
int f[N],f2[N],w[N],v[N],n;
signed main()
{IOS;n=10;//假设有10个物品。for(int i=0;i<n;i++)cin>>w[i]>>v[i]; for(int i=0;i<(1<<n);i++)for(int j=0;j<n;j++){if((1<<j)&i)continue;f[i|(1<<j)]=f[i]+w[j];f2[i|(1<<j)]=f2[i]+v[j];}//那么每个f[i]和f2[i]就表示当选择情况为i(二进制转十进制后)时的空间和价值 return 0;
}

剖析

显然,一维DP仅仅是用二进制的表示方法压缩了状态。
那我们再来一道例题:

P4802 [CCO2015] 路短最

题目描述

本题译自 CCO 2015 Day1 T2「Artskjid」
你可以通过许多的算法找到从一个地方到另外一个地方的最短路径。人们在他们的车上安装 GPS 设备然后他们的手机告诉他们最快的到达目的地的方式。然而,当在假期时,Troy 喜欢慢慢旅游。他想找最长的到目的地的路径以便他可以在路途中看许多新的以及有趣的地方。
因此,一个有效的路径包含一个不同城市的序列 c 1 , c 2 , . . . , c k c_1,c_2,...,c_k c1,c2,...,ck,并且对于每个 1 ≤ i < k 1\le i<k 1i<k,有道路从 c i c_i ci 通往 c i + 1 c_{i+1} ci+1
他不想重复访问任何城市,请帮他找出最长路径。

输入格式

第一行输入包括两个整数 n , m n,m n,m,分别表示城市总数和连接城市间的道路数,两城市间至多有一条道路。城市编号从 0 0 0 n − 1 n-1 n1,Troy 一开始在城市 0 0 0,城市 n − 1 n-1 n1 是他的目的地。
接下来 m m m 行每行三个整数 s , d , l s,d,l s,d,l,每个三元组表示这里有一条长为 l l l 的从城市 s s s 到城市 d d d 的路。每条路都是有向的,只能从 s s s d d d,不能反向。保证有一条从城市 0 0 0 n − 1 n-1 n1 的路径。

输出格式

输出一个整数表示以城市 0 0 0 为起点,以 n − 1 n-1 n1 为终点的最长路径长度,并且其中不重复访问城市,路径长度是所经过的道路长度之和。

样例 #1

样例输入 #1
3 3
0 2 5
0 1 4
1 2 3
样例输出 #1
7

提示

最短路为直接走城市 0 0 0 至城市 2 2 2 的道路,长度为 5 5 5 km。最长路为 0 0 0 1 1 1 2 2 2, 长度 4 + 3 = 7 4+3=7 4+3=7 km。
对于至少 30 % 30\% 30% 的数据, n ≤ 8 n\le 8 n8
对于 100 % 100\% 100% 的数据,有 2 ≤ n ≤ 18 , 2\le n \le 18, 2n18, 1 ≤ m ≤ n 2 − n , 1\le m \le n^2-n, 1mn2n, 0 ≤ s , d ≤ n − 1 , 0\le s,d \le n-1, 0s,dn1, s ≠ d , s\neq d, s=d, 1 ≤ l ≤ 10000 1\le l\le 10000 1l10000

分析

f [ i ] [ j ] f[i][j] f[i][j] 表示当前走到了 j j j 好节点,走过点的状态为 i i i 时的路程。

易有转移方程:

f[i][j]=max(f[i][j],f[i-(1<<j)][k]+d[k][j]);

不过需要满足:

if((1<<j)&i)if(k!=j&&((1<<k)&i)&&f[i-(1<<j)][k]!=-1)if(d[k][j])

即:

  1. i i i 是有 j j j 这一位的,或者理解为状态 i i i 的第 j j j 位为1。
  2. 上一个节点 k k k j j j 不能一样。
  3. i i i 是有 k k k 这一位的,或者理解为状态 i i i 的第 k k k 位为1。
  4. 上一步状态可用。
  5. k k k j j j 之间有路连接。

所以代码就出来了。

Code

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL);
using namespace std;
const int N=1<<19;
typedef double lf;
int n,m;
int d[21][21],f[N][20],x,y,z;
signed main()
{IOS;memset(f,-1,sizeof f);cin>>n>>m;for(int i=1;i<=m;i++)cin>>x>>y>>z,d[x][y]=z;f[1][0]=0;for(int i=0;i<(1<<n);i++){for(int j=0;j<n;j++){if((1<<j)&i)for(int k=0;k<n;k++)if(k!=j&&((1<<k)&i)&&f[i-(1<<j)][k]!=-1){if(d[k][j])f[i][j]=max(f[i][j],f[i-(1<<j)][k]+d[k][j]);}}}int ans=0;for(int i=1;i<(1<<n);i++)ans=max(ans,f[i][n-1]);cout<<ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/186098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java论坛数据以及搜索接口实现

一. 内容简介 java论坛数据以及搜索接口实现 二. 软件环境 2.1 java 1.8 2.2 mysql Ver 8.0.13 for Win64 on x86_64 (MySQL Community Server - GPL) 2.3 IDEA ULTIMATE 2019.3 2.4d代码地址 三.主要流程 3.1 创建数据库,创建数据表 3.2 开始编写接口&#xff0c;并测…

几种攻击方式

对抗攻击 Adversarial evasion&#xff08;对抗性逃避&#xff09;是指针对机器学习模型的一种攻击方式&#xff0c;旨在通过对输入数据进行微小但精心设计的修改&#xff0c;使模型产生错误的输出。这种攻击通常是有意识地利用模型的弱点&#xff0c;以便误导模型做出错误的决…

vuepress----1、快速开始

创建项目工程 本文会帮助你从头搭建一个简单的 VuePress 文档。如果你想在一个现有项目中使用 VuePress 管理文档&#xff0c;从步骤 3 开始。 创建并进入一个新目录 mkdir vuepress-starter && cd vuepress-starter使用你喜欢的包管理器进行初始化 yarn init # npm i…

键盘打字盲打练习系列之刻意练习——1

一.欢迎来到我的酒馆 盲打&#xff0c;刻意练习! 目录 一.欢迎来到我的酒馆二.选择一款工具三.刻意练习第一步&#xff1a;基准键位练习第二步&#xff1a;字母键位练习第三步&#xff1a;数字符号键位练习 四.矫正坐姿 二.选择一款工具 工欲善其事必先利其器。在开始之前&…

井盖位移报警器安装,智能化井盖厂家推荐

当井盖发生位移或倾斜时&#xff0c;通常会引起所处道路的安全隐患&#xff0c;给过往的车辆和行人带来许多潜在的危险。为了避免潜在的安全事故频繁出现&#xff0c;及时发现并处理井盖位移或倾斜才能更好的保障人民的安全。因此安装井盖位移报警器是满足政府和市民需求的。 单…

vue项目npm install报错Failed at the fibersa4.0.3 install script

报错如下 解决&#xff1a;降低node版本 降到12.16.0 参考链接

C语言如何格式化字符串

在C语言中&#xff0c;通过使用printf函数来格式化输出字符串。格式化字符串的语法如下&#xff1a; printf("format string", argument1, argument2, ...);其中&#xff0c;format string是格式化字符串&#xff0c; argument1, argument2, … 是要输出的参数。 格…

使用 TypeScript 改进异步操作和错误处理的策略

使用 TypeScript 改进异步操作和错误处理的策略 处理异步代码是 JavaScript 应用程序的主要内容。TypeScript 为异步操作带来类型安全&#xff0c;增强可预测性并减少运行时错误。本文旨在探索我们可以利用的模式来有效地管理异步操作和错误处理。 Async/Await Async/await …

Linux下删除当前目录下的所有目录

Linux下删除当前目录下的所有目录 Linux下删除当前目录下的所有目录&#xff0c;可以使用命令&#xff1a;rm -rf ./* rm -rf ./*可以得知rm -rf ./命令是删除当前目录下的所有文件和文件夹&#xff0c;但不会删除根目录下的文件。其中&#xff0c;".“代表当前目录&…

【加密相册】 隐私协议

【加密相册】隐私协议 1.个人信息的收集和使用 我们的应用程序不会收集用户的个人信息&#xff0c;包括姓名、地址、电子邮件地址、电话号码等。我们不会追踪用户的位置信息或共享用户的个人信息。 2. 非个人化信息的收集和使用 我们的应用程序可能会收集一些非个人化信息&a…

Pycharm新手开发指南

文章目录 前言一、常用功能介绍二、常用高效pycharm使用方法关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前言…

武汉芯源半导体首款车规级MCU,CW32A030C8T7通过AEC-Q100测试考核

近日&#xff0c;武汉芯源半导体正式发布首款基于Cortex-M0内核的CW32A030C8T7车规级MCU&#xff0c;这是武汉芯源半导体首款通过AEC-Q100 (Grade 2)车规标准的主流通用型车规MCU产品。 CW32A030C8T7通过AEC-Q100车规可靠性测试 作为武汉芯源半导体首款车规级MCU产品&#xff0…

Spring整合web环境

目录 Javaweb三大组件及环境特点 Spring整合web环境的思路及实现 Spring的web开发组件spring-web MVC框架思想及其设计思路 Javaweb三大组件及环境特点 Spring整合web环境的思路及实现 package com.xfy.listener;import com.xfy.config.SpringConfig; import org.springfra…

Linux中的fork()函数的面试题目

1.面试题目1 (1)fork 以后&#xff0c;父进程打开的文件指针位置在子进程里面是否一样&#xff1f;(先open再fork) (2)能否用代码简单的验证一下? (3)先fork再打开文件父子进程是否共享偏移量?父进程打开的文件指针位置在子进程里面是否一样&#xff1f;能否用代码简单验证一…

代理模式 1、静态代理 2、动态代理 jdk自带动态代理 3、Cglib代理

文章目录 代理模式1、静态代理2、动态代理jdk自带动态代理 3、Cglib代理 来和大家聊聊代理模式 代理模式 代理模式&#xff1a;即通过代理对象访问目标对象&#xff0c;实现目标对象的方法。这样做的好处是&#xff1a;可以在目标对象实现的基础上&#xff0c;增强额外的功能操…

【Openstack Train安装】八、placement安装

Placement 肩负着这样的历史使命&#xff0c;最早在 Newton 版本被引入到 openstack/nova repo&#xff0c;以 API 的形式进行孵化&#xff0c;所以也经常被称呼为 Placement API。它参与到 nova-scheduler 选择目标主机的调度流程中&#xff0c;负责跟踪记录 Resource Provide…

java学校高校运动会报名信息管理系统springboot+jsp

课题研究方案&#xff1a; 结合用户的使用需求&#xff0c;本系统采用运用较为广泛的Java语言&#xff0c;springboot框架&#xff0c;HTML语言等关键技术&#xff0c;并在idea开发平台上设计与研发创业学院运动会管理系统。同时&#xff0c;使用MySQL数据库&#xff0c;设计实…

五种多目标优化算法(MOPSO、MOAHA、NSGA2、NSGA3、MOGWO)求解微电网多目标优化调度(MATLAB)

一、多目标优化算法简介 &#xff08;1&#xff09;多目标粒子群优化算法MOPSO 多目标应用&#xff1a;基于多目标粒子群优化算法MOPSO求解微电网多目标优化调度&#xff08;MATLAB代码&#xff09;-CSDN博客 &#xff08;2&#xff09;多目标人工蜂鸟算法&#xff08;MOAHA…

QTreeWidgetItem 是 Qt 框架中的一个类,用于在树形控件中表示和操作树节点

QTreeWidgetItem 是 Qt 框架中的一个类&#xff0c;用于在树形控件中表示和操作树节点。 QTreeWidgetItem 代表树形控件中的一个节点&#xff0c;可以包含子节点、显示文本、图标和其他相关数据。它通常用于 QTreeWidget 或 QTreeWidget 的派生类中&#xff0c;用于构建和管理…

nexus制品库的介绍及详细部署使用

一、nexus 介绍 Nexus 是一个强大的仓库管理工具&#xff0c;用于管理和分发 Maven、npm、Docker 等软件包。它提供了一个集中的存储库&#xff0c;用于存储和管理软件包&#xff0c;并提供了版本控制、访问控制、构建和部署等功能。 Nexus 可以帮助开发团队提高软件包管理的效…