首页 > 其他分享 >区间 dp

区间 dp

时间:2023-08-10 20:57:59浏览次数:29  
标签:int long MAXN ANS 区间 using dp

模板区间 dp

  • 一个长 \(n(n \le 248)\) 的序列,选择数列中两个相邻且相等的元素,删去其中一个元素并使另一个元素的值 \(+1\),求数次操作后数列中的最大值
  • 将这看做是合并的过程
  • \(dp_{i, j}\) 表示区间 \([i, j]\) 和为一个答案的取值,这里的取值其实是唯一的,所以可以之间判断
  • 对于每个 \(dp_{i, j}\) 找到一个合法的 \(mid(i \le mid < r)\),使得 \(dp_{i, m} = dp_{m + 1, j}\),那么 \(dp_{i, j} = dp_{i, m} + 1\)
点击查看代码
#include <bits/stdc++.h>

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

const int MAXN = 300 + 3, MAXX = 502;

int n;
int a[MAXN];
int dp[MAXN][MAXN];

int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n;
  int ANS = 0;
  memset(dp, -1, sizeof(dp));
  for(int i = 1; i <= n; i++){
    cin >> a[i], ANS = max(ANS, a[i]), dp[i][i] = a[i];
  }
  for(int l = 2; l <= n; l++){
    for(int i = n - l + 1; i >= 1; i--){
      int j = i + l - 1;
      for(int m = i; m < j; m++){
        if(dp[i][m] != -1 && dp[m + 1][j] != -1 && dp[i][m] == dp[m + 1][j]){
          dp[i][j] = dp[i][m] + 1;
          ANS = max(ANS, dp[i][m] + 1);
        }
      }
    }
  }
  cout << ANS;
  return 0;
}

dp 的转移会有多余、重复的操作

  • 对于这一题,\(dp_{i, j}\) 有两种转移
  • 一种可以直接 \(dp_{i, j} = dp_{i, m} + dp_{m+1, j}\)
  • 另一种可能会出现合并操作,那么你其实只需要判断 \(a_i\) 和 \(a_j\) 是否有相同
  • 如果那个合并的中间,那么一定可以枚举到另一个 \(m\) 使得答案直接覆盖这个
点击查看代码
#include <bits/stdc++.h>

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

const int MAXN = 300 + 3;

int n, m;
int a[MAXN], b[MAXN];
int dp[MAXN][MAXN];

int main() {
  //ios::sync_with_stdio(0), cin.tie(0);
  cin >> n, m = 0;
  for(int i = 0; i <= n; i++){
    for(int j = 0; j <= n; j++){
      for(int x = 0; x <= n; x++) dp[i][j] = 1e9;
    }
  }
  for(int i = 1; i <= n; i++){
    cin >> a[i];
  }
  for(int i = 1; i <= n; i++){
    if(i == 1 || a[i] != a[i - 1]){
      b[++m] = a[i];
    }
  }
  for(int i = 1; i <= m; i++){
    dp[i][i] = 1;
  }
  for(int l = 2; l <= m; l++){
    for(int i = 1; i <= m - l + 1; i++){
      int j = i + l - 1;
      for(int m = i; m < j; m++){
        dp[i][j] = min(dp[i][j], dp[i][m] + dp[m + 1][j] - (b[i] == b[j]));
      }
    }
  }
  cout << dp[1][m];
  return 0;
}

标签:int,long,MAXN,ANS,区间,using,dp
From: https://www.cnblogs.com/huangqixuan/p/17621472.html

相关文章

  • 取石子游戏(博弈dp)
    在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的:有 n 堆石子,将这 n 堆石子摆成一排。游戏由两个人进行,两人轮流操作,每次操作者都可以从最左或最右的一堆中取出若干颗石子,可以将那一堆全部取掉,但不能不取,不能操作的人就输了。Orez......
  • reactnative ignite App + wordpress後台CMS 詳細案例
    1.0入門篇WordPress-Plugin-Boilerplate-Tutorial更为简洁的架构方案ReactNativeElements开发环境&生成项目&虚拟机调试&本地生成APK档&虚拟机运行APK档 2.0Ignite框架 Ignite是reactnative里最最齊全的軍火庫。https://github.com/infinitered/ignite 3......
  • 测试udp端口联通性
    时钟服务器默认使用的UDP协议的123端口,测试联通性时不能使用telnet命令,可以使用nc命令,如下:nc-vuz192.168.1.2123Connectionto192.168.1.2123port[udp/ntp]succeeded!如果没有安装,可以使用yum进行安装yuminstall-ync......
  • DPU替代网络可视化专用设备实现业务报文深度处理
    网络可视化中的深度业务处理网络可视化场景中,通常需要将采集过来的数据经过深度业务处理后再交给后端分析系统。这些深度业务处理功能包括:传统的深度业务处理通常由带CPU的框式设备完成,但框式设备成本高、功耗大、扩展不够灵活的种种给客户带来了极大的困扰。DPU算力的池化应用Heli......
  • Codeforces 1857E:Power of Points 区间?
    1857E.PowerofPointsDescription:\(n\)个数:\(x_1,···,x_n\),从左向右扫,当\(s=x_i\)时,可以将这\(n\)个数分为若干个闭区间\([s,x_1],[s,x_2],···,[s,x_n]\)(当然如果\(x_i<s\),则区间形如\([x_i,s]\))对于每一个\(s\in(x_1,···,x_n),\)有一个整数\(p\),记\(f_......
  • ISTDP:心灵的深海潜水
    (仅供参考)有一天,我被一种名为ISTDP(IntensiveShort-TermDynamicPsychotherapy,强化短期动态心理治疗)的心理治疗方法所吸引。我决定深入研究这个看似神秘的名字背后的内容。就像一个深海潜水员,我将踏上一个探索我们情感深处、挖掘我们心灵深层防御机制的旅程。1.ISTDP:强化短期动......
  • Wordpress:如何使用Elementor给页面Button做跳转页面锚点定位?
    网站页面有的关键部分不一定在页面首屏,但是如果其它页面有时候需要做跳转,比如联系框,需要直接跳转到联系框的实际位置,在使用Elementor插件的情况下,如何实现呢?前端技术告诉我们,要实现点击a标签或者按钮跳转到指定位置,可以使用id定位,并在跳转链接后加入#符号附带该ID即可如: ......
  • PROFIBUS-DP主站转ETHERCAT网关连接安川伺服支持EtherCAT总线吗
    大家好,今天要给大家介绍一款捷米的神秘产品,它的名字叫JM-DPM-ECT,是一款兼具PROFIBUS-DP主站功能的通讯网关。想象一下,它既能和PROFIBUS总线打交道,又能与ETHERCAT网络愉快地交流,是不是感觉很神奇?别看这只是一台小小的网关,它的作用可是非常大的!它可以将各种PROFIBUS-DP从站接入到ET......
  • Wordpress:如何放置谷歌GTM代码?
    使用Wordpress建站需要应用谷歌的GTM代码进行监测用户行为,那么如何安装GTM代码呢?分为两种,一.使用插件进行安装二.直接编辑代码Header模块进行安装。先看看谷歌GTM的安装要求:注意:1.script部分需要安装在head标签之内;2.noscript部分需要安装在body开始标签之后。 方法一......
  • 2023下半年产品经理NPDP认证8月19日正式开班,报名从速
    产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。  【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是全球范围内产品开发与管理专业人士最杰出的倡导者,协助个人、企业......