• 状态压缩类动态规划(参考小蓝书的总结)


    状态压缩类动态规划

    一、问题简介

    基于状态压缩的动态规划,又叫集合动态规划,顾名思义,这是一类以集合信息为状态的特殊的动态规划问题,主要有传统集合动态规划和基于连通性状态压缩的动态规划两种。

    如果有许多元素的状态都直接影响到决策,都需要被考虑到,为每一个 元素的状态都开一维数组来存储显然是行不通的,于是就需要有一种便于识别和操作的方式记录下各个元素的状态,即对多个元素的状态进行压缩存储,于是基于状态压缩的动态规划应运而生。

    二、特点

    我们通常把这样一类以一个集合内的元素信息作为状态且状态总数为指数级别的动态规划称为基于状态压缩的动态规划或集合动态规划。基于状态压缩的动态规划问题通常具有以下两个特点。

    ①数据规模的某一维或几维非常小。

    ②它需要具有动态规划问题的两个基本性质:最优性原理和无后效性。

    三、预备知识

    位操作是一种速度非常快的基本运算:有左移、右移、与、或、非等运算。

    左移:左移一位,相当于某数乘以2,比如110左移1位变为1100<=>6变为12,表示为(110 << 1) = 1100,因此左移x位相当于该数乘以2^x。

    右移:右移一位,相当于某数除以2,比如110右移1为变为11<=>6变为3,表示为(110 >> 1) = 11,因此右移x位相当于该数除以2^x。

    与运算:按位进行“与”运算,两数同一位都为1时结果为1,否则为0。例如101 & 100 = 100

    或运算:按位进行“或”运算,两位同一位都为0时结果为0,否则为1.例如101|100 = 111

    非运算:按位取反。例如~101 = 010.

    若当前状态为s,对s有下列操作。

    ①判断第i位是否为0:(S & (1 << i))== 0,意思是将1左移i位与S进行与运算后,看结果是否为零。

    ②将第i位设置为1:S| (1 << i),意思是将1左移i位与S进行或运算。

    ③将第i位设置为0:S & ~(1 << i),意思是将S与第i位为0,其余位为1的数进行与运算;

    例如S= 1010101,i = 5

    (S & (1 << i)):1010101 &0100000 = 0000000

    S| (1 << i): 1010101 | 0100000 = 1110101

    S & ~(1 << i) : 1010101 & 1011111 = 1010101

  • 相关阅读:
    linux下查看主板内存槽与内存信息
    centos 6 与 centos 7 服务开机启动、关闭设置的方法
    linux 配置本地光盘YUM源
    linux crontab定时任务不执行
    Linux下安装MySQL5.6
    Linux shell 自动删除n天前日志
    nginx request_time 和upstream_response_time
    linux中文件多行合并为一行的例子
    awk 处理文本:行转列,列转行
    nfs环境搭建报错clnt_create: RPC: Program not registered
  • 原文地址:https://www.cnblogs.com/rax-/p/9904138.html
Copyright © 2020-2023  润新知