当前位置: 代码迷 >> 综合 >> [luogu P2704] 炮兵阵地
  详细解决方案

[luogu P2704] 炮兵阵地

热度:4   发布时间:2023-12-08 06:02:28.0

[luogu P2704] 炮兵阵地

  • 题目描述
  • 解题过程
    • 思路
    • 流程
    • 代码
    • 感想

题目描述

点击此处查看题目描述

解题过程

思路

这道题的列数的数据范围很小,我们考虑用状态压缩进行动态规划

流程

a [ i ] a[i] a[i] 表示第 i i i 行的地形(0101用十进制存储) 先存储二进制地形,山峰 H H H 表示 1 1 1 ,平原就不用管,表示 0 0 0

d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k] 表示在上一行的状态为 k k k 时,第 i i i 行的状态为 j j j 时的最大炮台数
直接暴力往上枚举整个状态的复杂度是 O ( 2 3 m ? n ) O(2^{3m}*n) O(23m?n) 很显然会超时

我们可以提前处理炮台互不冲突的状态

F [ i ] F[i] F[i] 表示第 i i i 种炮台互不冲突的状态,设 D [ i ] D[i] D[i] 表示当前 F [ i ] F[i] F[i] 状态表示的炮台数

D [ i ] D[i] D[i] 比较简单:

int get_num (int x) {
    int countx = 0;while(x){
    countx ++;x = x