题目链接  Yet Another Minimization Problem

题意  给定一个序列,现在要把这个序列分成k个连续的连续子序列。求每个连续子序列价值和的最小值。

设$f[i][j]$为前$i$个数分成$j$段的最优解

不难得出状态转移方程$f[i][j] = min(f[k][j - 1], calc(j + i, i))$

该DP具有决策单调性

即若$f[i][j]$是从$f[x][j - 1]$转移到的,$f[i+1][j]$是从$f[y][j - 1]$转移到的,那么一定有$x <= y$。

考虑到这一点就可以用分治优化。

还有一点就是$calc()$的计算。

用莫队计算就可以了(分治的时候同一个递归状态下莫队查询端点的改变都是连续的)

时间复杂度$O(nklogn)$

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int N = 1e5 + 10;
const int A = 22; LL f[N][A], ret;
int a[N], cnt[N];
int n, m, l, r; void query_init(){
memset(cnt, 0, sizeof cnt);
l = 1, r = 0;
ret = 0;
} LL query(int ql, int qr){
while (r < qr){
++r;
ret += 1ll * cnt[a[r]];
++cnt[a[r]];
} while (r > qr){
--cnt[a[r]];
ret -= 1ll * cnt[a[r]];
--r;
} while (l > ql){
--l;
ret += 1ll * cnt[a[l]];
++cnt[a[l]];
} while (l < ql){
--cnt[a[l]];
ret -= 1ll * cnt[a[l]];
++l;
} return ret;
} void solve(int j, int l, int r, int st, int ed){
if (l > r) return;
int mid = (l + r) >> 1;
int x; rep(i, st, min(mid, ed)){
LL now = query(i, mid);
if (f[i - 1][j - 1] + now <= f[mid][j]){
f[mid][j] = f[i - 1][j - 1] + now;
x = i;
}
} if (l != r){
solve(j, l, mid - 1, st, x);
solve(j, mid + 1, r, x, ed);
}
} int main(){ scanf("%d%d", &n, &m);
rep(i, 1, n) scanf("%d", a + i); query_init(); rep(i, 1, n) rep(j, 0, m) f[i][j] = 1e18;
rep(i, 1, n) f[i][1] = query(1, i);
rep(j, 2, m) solve(j, 1, n, 1, n); printf("%lld\n", f[n][m]);
return 0;
}

Codeforces 868F Yet Another Minimization Problem(分治+莫队优化DP)的更多相关文章

  1. Codeforces 868F. Yet Another Minimization Problem【决策单调性优化DP】【分治】【莫队】

    LINK 题目大意 给你一个序列分成k段 每一段的代价是满足\((a_i=a_j)\)的无序数对\((i,j)\)的个数 求最小的代价 思路 首先有一个暴力dp的思路是\(dp_{i,k}=min(d ...

  2. CF868F Yet Another Minimization Problem 分治决策单调性优化DP

    题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...

  3. CodeForces 868F Yet Another Minimization Problem(决策单调性优化 + 分治)

    题意 给定一个序列 \(\{a_1, a_2, \cdots, a_n\}\),要把它分成恰好 \(k\) 个连续子序列. 每个连续子序列的费用是其中相同元素的对数,求所有划分中的费用之和的最小值. ...

  4. Codeforces 868F Yet Another Minimization Problem 决策单调性 (看题解)

    Yet Another Minimization Problem dp方程我们很容易能得出, f[ i ] = min(g[ j ] + w( j + 1, i )). 然后感觉就根本不能优化. 然后 ...

  5. Codeforces 868F. Yet Another Minimization Problem

    Description 给出一个长度为 \(n\) 的序列,你需要将它分为 \(k\) 段,使得每一段的价值和最小,每一段的价值是这一段内相同的数的个数 题面 Solution 容易想到设 \(f[i ...

  6. 【CodeForces】868F. Yet Another Minimization Problem

    原题链接 题目大意是有N个数,分成K段,每一段的花费是这个数里相同的数的数对个数,要求花费最小 如果只是区间里相同数对个数的话,莫队就够了 而这里是!边单调性优化边莫队(只是类似莫队)!而移动的次数和 ...

  7. Codeforces 375D - Tree and Queries(dfs序+莫队)

    题目链接:http://codeforces.com/contest/351/problem/D 题目大意:n个数,col[i]对应第i个数的颜色,并给你他们之间的树形关系(以1为根),有m次询问,每 ...

  8. Codeforces 940F Machine Learning (带修改莫队)

    题目链接  Codeforces Round #466 (Div. 2) Problem F 题意  给定一列数和若干个询问,每一次询问要求集合$\left\{c_{0}, c_{1}, c_{2}, ...

  9. Codeforces 700D - Huffman Coding on Segment(莫队+根分)

    Codeforces 题目传送门 & 洛谷题目传送门 好家伙,刚拿到此题时我连啥是 huffman 编码都不知道 一种对 \(k\) 个字符进行的 huffman 编码的方案可以看作一个由 \ ...

随机推荐

  1. Mac远程访问Ubuntu

    MacOS和Ubuntu连接到同一个网络使用ping命令可以通信即可.SSH使用SSH可以很方便的在MacOS上访问Ubuntu,不过只能用命令行操作,相当于连接了Ubuntu的终端. 1. Ubun ...

  2. List删除元素

    在单线程环境下的解决办法 public void remove() { if (lastRet == -1) throw new IllegalStateException(); checkForCo ...

  3. URAL - 2065 Different Sums (思维题)

    题意: 给n和k,让你用不小于 k 个不同的数字构成一个长度为n的序列,使得序列中不同的区间和的数目最小. n,k<=500 k-1个数填一些数字的一正一负,这样有些区间和为0. 剩下的都填0. ...

  4. Leetcode 814. 二叉树剪枝

    题目链接 https://leetcode-cn.com/problems/binary-tree-pruning/description/ 题目描述 给定二叉树根结点 root ,此外树的每个结点的 ...

  5. selenium2-元素管理方式及解析

    1.管理文件格式:yaml 2.Yaml里面的内容格式:   3.格式说明: baidu_input后面接上":",直接回车,然后空两格 type与value这两个key是固定 ...

  6. Mysql新建数据库、删除数据库

    新建数据库 create database db_name; //db_name为新建数据库的名字 mysql> create database db_name; Query OK, row a ...

  7. Mysql显示所有数据库

    show databases; mysql> show databases; +--------------------+ | Database | +--------------------+ ...

  8. 算法学习记录-查找——二叉排序树(Binary Sort Tree)

    二叉排序树 也称为 二叉查找数. 它具有以下性质: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值. 它的左.右子树也分别 ...

  9. python - 函数的相互调用 及 变量的作用域

    # -*- coding:utf-8 -*- '''@project: jiaxy@author: Jimmy@file: study_函数的相互调用及变量的作用域.py@ide: PyCharm C ...

  10. python_字符串,元组,格式化输出

    一.字符串 1.字符串是有成对的单引号或者双引号括起来的.例如:name="张三",sex="女" 2.字符串的索引是从0开始的 3.字符串的切片 a.单个字符 ...