文章目录

  • 题目描述
    • 样例输入
    • 样例输出
  • 解析
  • 代码

题目描述

给你一个数列,分成m段,每段的价值为相同数对的对数
求最小价值和

样例输入

10 2
1 2 1 2 1 2 1 2 1 2

样例输出

8

解析

容易想到区间dp
定义dp[i][j]:把前i个数分成j段的最小价值
那么枚举最后一段断点的位置,转移就是:

dp[i][j]=min(dp[i][j],dp[k][j-1]+calc(k+1,i)
(1<=k<i)

不难发现本题是符合决策单调性的
就可以利用这个进行优化啦
使用分治思路

还有一个问题是关于calc的计算
可以使用一个类似于简化的莫队的思路,维护两个指针即可
这样就完事啦

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+100;
int m,n;
int a[N],buc[N];
int l=1,r=0;
ll sum=0;
ll add(int x){return buc[a[x]]++;}
ll del(int x){return --buc[a[x]];}
ll calc(int nl,int nr){while(r<nr) sum+=add(++r);while(r>nr) sum-=del(r--);while(l>nl) sum+=add(--l);while(l<nl) sum-=del(l++);return sum;
}
ll dp[N][30];
int now;
void solve(int x,int y,int px,int py){if(x>y) return;int mid=x+y>>1,pl;
//  printf("x=%d y=%d px=%d py=%d\n",x,y,px,py);dp[mid][now]=2e16;for(int i=px;i<=min(py,mid-1);i++){if(dp[mid][now]>dp[i][now-1]+calc(i+1,mid)){pl=i;dp[mid][now]=dp[i][now-1]+calc(i+1,mid);
//          printf("mid=%d k=%d pl=%d dp=%d\n",mid,now,pl,dp[mid][now]);}}
//  printf("x=%d y=%d px=%d py=%d mid=%d dp=%lld\n",x,y,px,py,mid,dp[mid][now]);solve(x,mid-1,px,pl);solve(mid+1,y,pl,py);
}
int main(){//  freopen("dp.in","r",stdin);
//  freopen("dp.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=n;i++){dp[i][1]=calc(1,i);
//      printf("i=%d k=1 dp=%lld\n",i,dp[i][1]);}for(int k=2;k<=m;k++){now=k;solve(1,n,0,n);//for(int i=1;i<=n;i++) printf("i=%d k=%d dp=%lld\n",i,k,dp[i][k]);}printf("%lld\n",dp[n][m]);
}
/*
10 2
1 2 1 2 1 2 1 2 1 25 2
1 1 1 1 1
*/

分羊(区间dp:分治与决策单调性优化)相关推荐

  1. 算法学习——决策单调性优化DP

    update in 2019.1.21 优化了一下文中年代久远的代码 的格式-- 什么是决策单调性? 在满足决策单调性的情况下,通常决策点会形如1111112222224444445555588888 ...

  2. CF834D. The Bakery(线段树优化dp 决策单调性优化dp)

    linkkkkk 题意: 将一个长度为 n 的序列分为 m段,使得总价值最大. 一段区间的价值表示为区间内不同数字的个数. n≤35000,m≤50 思路: 考虑朴素的dpdpdp方程:dp[i][j ...

  3. 单调队列优化和决策单调性优化

    前言:dp蒟蒻拼命挽救一下dp a....,会围绕三个"形如"来写...但更重要的是本质理解啊qwq A.单调队列优化: 有时状态转移方程形如f[i][j]=min{f[i-1][ ...

  4. 【决策单调性】玩具装箱(金牌导航 决策单调性优化DP-1)

    玩具装箱 金牌导航 决策单调性优化DP-1 题目大意 给出若干个物品,把iii到jjj个物品装在一起的长度l=j−i+∑k=ijakl=j-i+\sum_{k=i}^{j}a_kl=j−i+∑k=ij ...

  5. BZOJ2687 交与并/BZOJ2369 区间【决策单调性优化DP】【分治】

    Description 对于一个区间集合 {A1,A2--Ak}(K>1,Ai不等于Aj(i不等于J),定义其权值 S=|A1∪A2∪--AK|*|A1∩A2--∩Ak| 即它们的交区间的长度乘 ...

  6. [CodeForces1603D] Artistic Partition(四边形不等式 + 决策单调性优化dp + 分治 + 线性筛 + 数论分块)

    problem codeforces 对于给定的正整数 l≤l\leql≤,定义 c(l,r)c(l,r)c(l,r) 为满足下列条件的正整数对 (i,j)(i,j)(i,j) 的数量: l≤i≤j≤ ...

  7. 【CF868F】Yet Another Minimization Problem (决策单调性优化dp+分治)

    description 点击查看题目 solution code 设dpi,jdp_{i,j}dpi,j​:把前iii个数划分jjj段的最小花费,wi,jw_{i,j}wi,j​:[i,j][i,j] ...

  8. 2020小米邀请赛网络选拔赛第二场H Knapsack 决策单调性优化大容量多重背包 分治

    https://ac.nowcoder.com/acm/contest/7502/H 学习自 https://blog.csdn.net/qq_30361651/article/details/109 ...

  9. [BZOJ2216][Poi2011]Lightning Conductor[决策单调性优化]

    最初在HDU的ACM模板上看到这个分治的DP优化 用这个的前提是不强制在线(f[i]不由前面的f转移过来)且决策单调 \[ \forall j\in \left[ \text{1,}n \right] ...

最新文章

  1. 推荐两款快速查找/替换电脑中文件的软件
  2. Codeforces Round #133 (Div. 2) C. Hiring Staff 想法题目
  3. Mysql数据库安全管理配置
  4. IOC操作Bean管理XML方式(外部属性文件)
  5. Waymo无人出租车年底发射,现已进入定价环节 | 公交部门竟成友军?
  6. Pannellum:实例之通过按钮控制全景图
  7. 01-Python简介
  8. java做游戏前端_小游戏——金庸奇侠传(JAVA,对面向对象的进一步了解)
  9. 明解C语言中级篇练习代码------第八章
  10. 贷款用户逾期问题Task2
  11. 1.学习编程从c语言开始
  12. 计算机考试上网题操作步骤,计算机等级考试一级复习 上网试题操作方法-
  13. 条码固定资产管理系统的作用,固定资产条码化管理
  14. 【yolov3】如何使用摄像头进行目标检测——yolov3-pytorch摄像头检测教程
  15. textpad和masm搭建汇编环境
  16. 我的物联网项目(二十六) 商家微信充值流程优化
  17. C语言、编程语言发展史
  18. 2019蓝桥杯B组省赛反思总结
  19. 深度学习——人工神经网络中为什么ReLu要好过于tanh和sigmoid function?
  20. c++学习笔记【oop与pop的辨析】

热门文章

  1. mysql savepoint作用_savepoint原理
  2. 获取上传图片的大小 php,thinkphp5 获取上传图片的大小和信息
  3. 你连简单的枚举类都不知道,还敢说自己会Java???滚出我的公司
  4. oracle 数字处理函数,Oracle函数-单行函数-数字、日期、日期处理函数
  5. d.ts文件可以注释html吗,如何编写一个d.ts文件的步骤详解_旧店_前端开发者
  6. 问题 D: 二叉树求高度
  7. leetcode139. 单词拆分
  8. 一文了解树在前端中的应用,掌握数据结构中树的生命线
  9. [剑指offer]面试题3:二维数组中的查找
  10. 蓝桥杯2017初赛-k倍区间-前缀和