首页 > 其他分享 >第一阶段复习——动态规划2

第一阶段复习——动态规划2

时间:2024-05-28 23:12:25浏览次数:26  
标签:状态 判断 复习 压缩 合法 动态 规划 第一阶段

目录

状态压缩动态规划

就是对状态做一个压缩,一般是用二进制表示,比如

P1896 [SCOI2005] 互不侵犯

每一行的状态一般来说要开好多维数组,然而一个二进制就搞定了。

预处理:首先 1<<n 范围枚举状态,筛选出合法状态,记录每一个合法状态的点数。

设 \(f_{i,j,k}\) 表示前 i 行,放 j 个士兵,当前行的状态是 k 的方案数。初始化 \(f_{0,0,0}=1\)。

转移:

对于前i行,放j个士兵的情况,考虑转移。双重循环枚举状态,分别用a和b表示(a循环在外),用c记录a状态的士兵数。

进行判断:如果j不小于c;正对判断;错位判断(位运算的巧用)。如果都满足,则 \(f_{i,j,a}=f_{i-1,j-c,b}\)

具体见代码。

最后有一个技巧,多算一层,直接输出 \(f_{n+1,k,0}\) 就可以,虽说并没有节省时间复杂度。

P1879 [USACO06NOV] Corn Fields G

和上一个问题的区别就在于约束条件,变成了十字形的,另外还加了一个贫瘠土地的限制。

判断条件:!(s[a] & s[b]) && (s[a] & g[i]) == s[a]

第一个的意义是水平判断,和上题一样;第二个是障碍判断,位运算巧用。

滚动数组的另一种操作方法,用与运算来维护,每次更新 \(i\oplus 1\) 的位置就好。

P2704 [NOI2001] 炮兵阵地

十字形的约束扩大了一层。

\(f_{i,a,b}\) 表示前i行,第i行是状态a,第i-1行是状态b的方案数。

判断:

image

但这里面有一些冗余,删除之后:(因为比较状态合法只需要a-b,a-c之间合法,b-c就合法;另外,b这一层在a的上一层,b肯定已经被算过合法状态了,所以转移一定不会出现不合地图的情况,所以不用判断b的地图合法性)

image

转移:

\(f[i \& 1][a][b] = \max(f[i \& 1][a][b], f[(i - 1) \& 1][b][c] + num[s[a]])\)

将第一维压缩为两个位,与运算交替,可以通过此题。

一些习题

P2622 关灯问题II;PRZ

动态规划5】状态压缩动态规划

[能力提升综合题单Part4 动态规划2]

标签:状态,判断,复习,压缩,合法,动态,规划,第一阶段
From: https://www.cnblogs.com/CYLSY/p/18219165

相关文章

  • C++ Primer Plus第十八章复习题
    1、使用用大括号括起的初始化列表语法重写下述代码。重写后的代码不应使用数组ar。classz200{private:intj;charch;doublez;public:Z200(intjv,charchv,zv):j(jv),ch(chv),z(zv){}};doublex=8.8;std::strings="whatabracingeff......
  • std-软件过程与管理期末复习
    软件过程与管理一、概论1.软件工程的三要素。过程、方法、工具  软件过程的定义。软件过程是用于软件开发及维护的一系列活动、方法及实践3.常见的软件过程分类。常见的软件过程。  二、软件质量管理1.软件质量的定义。  2.ISO/IEC9126的结构、ISO/......
  • 2022年全国职业院校技能大赛高职组“信息安全管理与评估”赛项第一阶段任务书
    2022年全国职业院校技能大赛高职组“信息安全管理与评估”赛项任务书1一、赛项第一阶段时间180分钟。二、赛项信息竞赛阶段任务阶段竞赛任务竞赛时间分值第一阶段平台搭建与安全设备配置防护任务1网络平台搭建180分钟50任务2......
  • web前端之vue动态访问静态资源、静态资源的动态访问、打包、public、import、URL、Vit
    MENU静态资源与打包规则动态访问静态资源直接导入将静态资存放在public目录中动态导入URL构造函数结束语实践与坑附文静态资源与打包规则介绍Vite脚手架在打包代码的时候,会把源代码里对于静态资源的访问路径转换为打包后静态资源文件的路径。主要的区别是文件指纹......
  • 数据展示动态(跑分)显示
    1.页面显示(强烈推荐)<template#header><avue-data-tabs:option="dataOptions":data="tabData"style="width:75%;"></avue-data-tabs></template>2.具体代码阿和方法实现2.1官方推荐代码<template>&......
  • 日期选择器:年 月 日 动态切换显示
    1.组件样式部分(elementUI)实现<el-row><el-col:span="10"><el-button-group><el-button:class="{'is-active':selectedButton==='year'}"@click="changeToYe......
  • vue3 动态组件
    <template><divclass="max_box"><a-tabsv-model:activeKey="activeKey"@change="callback"><a-tab-pane:tab="item.tab"v-for="iteminstate.list":key="i......
  • 动态内存管理
    目录1.为什么要有动态内存分配2.malloc和free2.1malloc2.2free3.calloc和realloc3.1calloc3.2realloc4.常见的动态内存的错误4.1对NULL指针的解引用操作4.2对动态开辟空间的越界访问4.3对非动态开辟内存使⽤free释放4.4使⽤free释放⼀块动态开辟内存的⼀部......
  • c++动态内存管理干货
     c++兼容c所以之前C语言使用的方式在c++中同样可以使用,但c++给出了更加简便的动态内存管理方法.1.申请内置类型空间c++定义了新的关键字new和delete(都是操作符不是函数),使用方法如图:需要注意的是,用new申请空间默认不会初始化,但是可以初始化。如图:另外,【】里面可以是变量:......
  • 动态渲染之vue页面向组件间传值
    ==Vue页面文件==//vue文件引入组件importceliangjulifrom"@/components/Map/celiangjuli.vue";//使用组件key:celiangMethod(任意名)<celiangjuli:celiangMethod="celiangMethod"></celiangjuli>////定义初始化valueletceliangMethod=ref();//......