首页 > 其他分享 >Dp的优化

Dp的优化

时间:2022-08-19 17:00:18浏览次数:94  
标签:return int dp Dp 权值 优化 单调

Dp的优化

单调栈优化Dp

The Great Wall II

题意:

给你 n个点,问分成 1∼n 组,每一组的代价就是这一组中的最大值,问每一种情况的最小权值和。

思路:

把状态定义为 d i j 表示 走到 i 号点了 分了j 组的最小代价。

那么先枚举分成了几组 ,枚举从哪个点转移。

d[i][j]=min(d[i][j],d[k][j-1]+max(a[k+1]......a[i]));

这样的暴力的复杂度是 n^3的,考虑怎么优化。

首先 max(1 ~ j)这个肯定是单调递增的,然后如果碰到一个比较大的点,比前面的都大的情况的话,最优的转移肯定是找到前面 \(d[k][j-1]\)的最小值,因为当前的所有的额外权值是固定的,所以前面的这个越小,总价值就越小。所以用单调栈维护一个 权值 递增的单调栈,也就是 后面这个max 的这一半,同时维护一个单调栈中弹出来的最小的 dp 值,也就是说 如果一个大权值放到栈里面,弹出来这些值可以也可以作为转移的点。同时还需要维护一个当前 dp 的值,用于判断 当前这个点 要不要新开一个新的组。

Code

const int N = 8100, mod = 1e9 + 7, INF = 1e10;
int lowbit(int x) { return x & -x; }
int gcd(int a, int b) { return a % b == 0 ? b : gcd(b, a % b); }

int a[N];
int d[N][2];//滚动数组。
int pre[N], mn[N];
// pre 代表当前的Dp值, mn代表 j-1中的 dp 的最小值

int stk[N];// 栈

//  走到 i 号点了 分了j 组的最小代价
void solve() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 1; i <= n; i++) d[i][1] = max(d[i - 1][1], a[i]);
  //当前分成了 1组
  cout << d[n][1] << endl;
  for (int i = 2; i <= n; i++) {
    int tt = 0;
    pre[0] = INF;
    for (int j = i; j <= n; j++) {
      int temp = d[j - 1][(i - 1) & 1];// 
       // temp 相当于 如果不考虑 前面已经分好的组,一开始就是 前 j-1 个分成了 i-1 组
     // 栈维护一个递增的序列保证,这一段区间的max 都是由 aj 主导
      while (tt > 0 && a[stk[tt]] <= a[j]) temp = min(temp, mn[tt--]);
        
      stk[++tt] = j;
      mn[tt] = temp;// 当前的最小值
      pre[tt] = min(pre[tt - 1], temp + a[j]);
        // 可能 不在这个点 分成一个新的组 代价和比较小
      // if (j == 2) cout << temp << " " << pre[tt] << endl;
      d[j][i & 1] = pre[tt];// 更新
    }
    cout << d[n][i & 1] << endl;
  }
}

signed main() {
  kd;
  int _;
  _ = 1;
  // cin>>_;
  while (_--) solve();
  return 0;
}

标签:return,int,dp,Dp,权值,优化,单调
From: https://www.cnblogs.com/hxxO-o/p/16602605.html

相关文章

  • 练习9:尾递归优化
    尾递归和普通递归有啥区别尾调用,是指函数内部的最后一个动作是函数调用。该调用的返回值,直接返回给函数。举个例子://尾调用functionf(x){returng(x);}//非......
  • 千兆以太网_发送模块设计_udp_rgmii_tx
    功能:在FPGA开发板上,用户数据存于FIFO,经过UDP,IP,MAC封装,通过RGMII接口发送出去。完整的以太网应该包括收发功能,这里介绍发送模块。实现:序列机过程:发送顺序:  MAC帧头—......
  • 【kuangbin】专题十二 基础DP1
    【kuangbin】专题十二基础DP1https://vjudge.net/contest/68966#overview前几周写了来着,忘更了我饿了,先放代码,吃完再来A-MaxSumPlusPlus#include<bits/stdc++.......
  • 凸优化|凸函数
    一、定义和基本性质1.1定义一个函数\(f:\mathbf{R}^n\rightarrow\mathbf{R}\)是凸函数当且仅当\(\mathrm{dom}\;f\)是凸集,且对于所有的\(x,y\in\mathrm{dom}\;f\)......
  • 凸优化|凸集
    1.直线和线段假设\(x_1\nex_2\)是\(\mathbf{R}^n\)空间(n维欧氏空间)中的两个点,直线\[y=\thetax_1+(1-\theta)x_2\]是穿过\(x_1\)和\(x_2\)的直线,\(\theta\i......
  • 压缩空间尝试使用只与前一个状态有关的dp dp[2][N]
    之后每次迭代t^1使得0->11->0这里有n个世界,每个世界都有m个点。在i个世界中,你最多可以选择一条边,从u点移动到v点(可以选择不移动)。随后进入到第i+1个世界......
  • 扑克牌(期望DP)
    题意Rainbow把一副扑克牌(\(54\)张)随机洗开,倒扣着放成一摞。然后Admin从上往下依次翻开每张牌,每翻开一张黑桃、红桃、梅花或者方块,就把它放到对应花色的堆里去。Rainb......
  • 3.最优化问题
    1.小批量数据梯度下降在大规模的应用中(比如ILSVRC挑战赛),训练数据可以达到百万级量级。如果像这样计算整个训练集,来获得仅仅一个参数的更新就太浪费了。一个常用的方法是计......
  • 【DP 记录】AcWing 734. 能量石
    传送门给你几个物品,每种选一次,求最大价值,首先想到01背包,但是我们遇到了一个问题:普通的01背包在选择物品时是不讲求顺序的,但在这道题中,物品的选择是有顺序的(即对最优......
  • uniapp 分包优化和组件按需注入
      mainfest.json文件下找到源码视图  //分包优化"optimization":{"subPackages":true},//组件按需注入"lazyCodeLoading":"requiredComponent......