首页 > 其他分享 >状压 dp 变式

状压 dp 变式

时间:2023-08-07 19:57:31浏览次数:35  
标签:变式 int 状压 MAXK MAXN using include dp

利用 \(dp_i\) 的取值

  • 一开始这就是状压 dp 模版
  • 但是有时间要求,而且又要满足连续时间超过 \(L\),显然连续时间越大越好
  • 那么 \(dp_i\) 的取值就是最大连续时间
  • 转移时可以根据 \(dp_i\) 进行二分,总时间复杂度能够勉强通过
点击查看代码
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <set>

using namespace std;
using LL = long long;
using PII = pair<int, int>;

const int MAXN = 25 + 3, MAXK = 5e6 + 3;
const LL mod = 1e9 + 7;

struct st_cmp{
  bool operator() (int i, int j) const {
    return i > j;
  }
};

int n, L;
set<int, st_cmp> st[MAXN];
int dp[MAXK], D[MAXN], cnt1[MAXK];

int main(){
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n >> L;
  for(int i = 1, C; i <= n; i++){
    cin >> D[i] >> C;
    for(int j = 1, X; j <= C; j++){
      cin >> X, st[i].insert(X);
    }
  }
  for(int i = 1; i < (1ll << n); i++){
    cnt1[i] = cnt1[i ^ (i & (-i))] + 1;
  }
  int ANS = 1e9;
  for(int i = 0; i < (1ll << n); i++){
    for(int j = 0; j < n; j++){
      if((i >> j) % 2 == 0){
        auto s = st[j + 1].lower_bound(dp[i]);
        int _i = i + (1ll << j);
        if(s != st[j + 1].end()){
          dp[_i] = max(dp[_i], *s + D[j + 1]);
          if(dp[_i] > L){
            ANS = min(ANS, cnt1[_i]);
          }
        }
      }
    }
  }
  cout << (ANS >= 1e9 ? -1 : ANS);
  return 0;
}

动态的状压 dp

  • \(dp_{i, x}\) 表示 \(a_{i-k+1} \cdots a_i\) 所表示的二进制数(0 为没有被选择,1 为已经被选择)
  • 这就会不断删除最后一个,不断加入第一个,可以通过位运算或取模来 \(O(1)\) 计算
  • 不断修改,在中途计算答案
点击查看代码
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <set>

using namespace std;
using LL = long long;
using PII = pair<int, int>;

const int MAXN = 1e5 + 3, MAXK = 300 + 3;

int n, k;
int a[MAXN];
int dp[MAXN][MAXK];

int gcd(int A, int B){
    return !B ? A : gcd(B, A % B);
}

int main(){
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n >> k;
  for(int i = 1; i <= n; i++){
    cin >> a[i];
  }
  int ANS = 0;
  for(int i = 1; i <= n; i++){
    for(int j = 0; j < (1ll << k); j++){
      int _j = (j * 2) % (1ll << k);
      dp[i][_j] = max(dp[i][_j], dp[i - 1][j]);
      ANS = max(ANS, dp[i][_j]);
    }
    for(int _k = 1; i - _k >= 1 && _k <= k; _k++){
      int _i = i - _k;
      if(gcd(a[i], a[_i]) > 1) continue;
      for(int j = 0; j < (1ll << k); j++){
        if((j >> (_k - 1)) % 2 == 0){
          int _j = ((j + (1ll << (_k - 1))) * 2 + 1) % (1ll << k);
          dp[i][_j] = max(dp[i][_j], dp[i - 1][j] + 1);
          ANS = max(ANS, dp[i][_j]);
        }
      }
    }
  }
  cout << ANS;
  return 0;
}
## https://codeforces.com/problemset/problem/165/E

标签:变式,int,状压,MAXK,MAXN,using,include,dp
From: https://www.cnblogs.com/huangqixuan/p/17612551.html

相关文章

  • Wordpress:如何修改Astra主题的(navigation)翻页模块?
    使用Astra搭建日文网站的时候,因为默认是英文,有些模块需要改成日文;比如分页器(navigation) 具体步骤如下:1.进入后台点击Appearance->Themefileeditor-> inc/core/class-theme-strings.php  2.将所有的需要修改的文本修改成日文; 3.修改成功后,提示Fileeditedsuc......
  • uniapp获取位置时显示getLocation:fail the api need to be declared in the required
    uniapp获取位置时显示getLocation:failtheapineedtobedeclaredintherequiredPrivateInfosfieldinapp.json/ext.json解决方式:1.manifest.json文件 "mp-weixin" 中添加"permission":{"scope.userLocation":{&quo......
  • Atcoder Grand Contest 058 F - Authentic Tree DP
    考虑给\(f(T)\)赋予组合意义。一个直观的想法是,在每条边中间新建一个节点,然后每次选择一条边对应的点,然后把它删掉,递归剩余的两个部分,但是你会发现这样分母不对,应该是\(n\)但在这个模型里只有\(n-1\)。考虑魔改这个模型。我们在每个边对应的点下面添加\(998244352\)个点,你......
  • 一些DP
    P1273有线电视网树上背包的变形\[f_{u,j+k}=\max_{v\inson(u)}f_{u,j}+f_{v,k}-w_{u,v}\]这里写成\(j+k\)是为了和代码一致。\(f_{u,j+k}\) 代表以\(u\)为根的子树中,选择了\(j+k\)个叶子结点的利润最大值。\(w_{u,v}\)代表\(u\)到\(v\)的......
  • m基于QPSK+LDPC的载波同步和定时同步matlab性能仿真,包括Costas和gardner环,LDPC,四倍
    1.算法仿真效果matlab2022a仿真结果如下:本程序在博主之前的《基于QPSK的载波同步和定时同步性能仿真,包括Costas环的gardner环》算法基础上,加入了LDPC编译码进行仿真。2.算法涉及理论知识概要载波同步是相干解调的基础,不管对于模拟通信还是数字通信来说,只要是相干解调,接收端......
  • m基于QPSK+LDPC的载波同步和定时同步matlab性能仿真,包括Costas和gardner环,LDPC,四倍
    1.算法仿真效果matlab2022a仿真结果如下:   本程序在博主之前的 《基于QPSK的载波同步和定时同步性能仿真,包括Costas环的gardner环》 算法基础上,加入了LDPC编译码进行仿真。 2.算法涉及理论知识概要       载波同步是相干解调的基础,不管对于模拟通信还......
  • 星融元:DPU替代网络可视化专用设备实现业务报文深度处理
    网络可视化中的深度业务处理网络可视化场景中,通常需要将采集过来的数据经过深度业务处理后再交给后端分析系统。这些深度业务处理功能包括:传统的深度业务处理通常由带CPU的框式设备完成,但框式设备成本高、功耗大、扩展不够灵活的种种给客户带来了极大的困扰。DPU算力的池化应用Heli......
  • udp发送上位机(1)
    发送彩色视频RGB888时,在上位机,通过BGR2BGR565转换为16位数据,再传输时加上行号,在DMA里也要对读出的数据进行高低位的变换,组成RGB565格式如下图所示,在灰度图时将每帧刷新改为了每一行刷新,这是因为在彩色图像时,刷新一帧的时间大于2ms,而灰度时为0.7ms,这就会导致在刷新的时候,新的数据......
  • SOS DP(子集 DP)
    Part1:前置知识1、状压DP2、基本的位运算操作Part2:SOSDP(以下的内容大部分翻译至CF上的原文)1、例题引入给定一个含\(2^N\)个整数的集合\(A\),我们需要计算:\(\forallx\subseteqA\),\(x\)中所有元素\(i\)的\(A[i]\)的和,即求:\[F[mask]=\sum\limits_{i\subseteq......
  • FreeSWITCH添加自定义endpoint之媒体交互
    操作系统:CentOS7.6_x64FreeSWITCH版本:1.10.9 之前写过FreeSWITCH添加自定义endpoint的文章:https://www.cnblogs.com/MikeZhang/p/fsAddEndpoint20230528.html今天记录下endpoint媒体交互的过程并提供示例代码及相关资源下载,本文涉及示例代码和资源可从如下渠道获取:关......