题目描述
LYK在学习dp,有一天它看到了一道关于dp的题目。
这个题目是这个样子的:一开始有n个数,一段区间的价值为这段区间相同的数的对数。我们想把这n个数切成恰好k段区间。之后这n个数的价值为这k段区间的价值和。我们想让最终这n个数的价值和尽可能少。
例如6个数1,1,2,2,3,3要切成3段,一个好方法是切成[1],[1,2],[2,3,3],这样只有第三个区间有1的价值。因此这6个数的价值为1。
LYK并不会做,丢给了你。

输入格式(dp.in)
第一行两个数n,k。
接下来一行n个数ai表示这n个数。

输出格式(dp.out)
一个数表示答案。

输入样例
10 2
1 2 1 2 1 2 1 2 1 2

输出样例
8

数据范围
对于30%的数据n<=10。
对于60%的数据n<=1000。
对于100%的数据1<=n<=100000,1<=k<=min(n,20),1<=ai<=n。
其中有30%的数据满足ai完全相同均匀分布在所有数据中。

分析:很容易想到dp的做法,设f[i][j]表示前i个数中分成了k个区间的最小价值和.

f[i][j] = min{f[k][j-1] + sum[k+1][i]}.这样dp只有60分,需要优化.注意到当j不变时,i增长,k是一定不减的.因为如果f[i+1][j]能从k前面转移过来,那么f[i][j]一定也能从k前面转移过来,这与f[i][j]从k转移过来是自相矛盾的,所以k一定不减.那么可以用1D1D优化.

类似分治,如果f[mid][j]从f[pos][j-1]转移而来,那么f[l~mid-1][j]一定从f[l'~pos][j-1]转移而来,f[mid + 1~r][j]一定从f[pos~r'][j-1]转移而来,递归下去,就能更新完所有答案.因为涉及到多次的区间求相同数对的个数,可以像莫队一样用两个指针来维护.

    复杂度一般就是把朴素dp的一个n变成log,这道题的复杂度就是O(n*logn*k).

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std;
typedef long long ll;
const ll inf = 1LL << ;
ll f[], n, k, a[], c[], g[], L = , R = , tot, pos, mx; void move(int l, int r)
{
while (L < l)
{
c[a[L]]--;
tot -= c[a[L]];
L++;
}
while (L > l)
{
L--;
tot += c[a[L]];
c[a[L]]++;
}
while (R < r)
{
R++;
tot += c[a[R]];
c[a[R]]++;
}
while (R > r)
{
c[a[R]]--;
tot -= c[a[R]];
R--;
}
} void solve(ll l, ll r, ll x, ll y)
{
if (x > y)
return;
ll mid = (x + y) >> ;
mx = inf;
for (ll i = l; i <= r; i++)
if (i < mid) //mid只能从比mid小的地方转移过来
{
move(i + , mid);
if (f[i] + tot < mx)
{
mx = f[i] + tot;
pos = i;
}
}
g[mid] = mx;
solve(l, pos, x, mid - );
solve(pos, r, mid + , y);
} int main()
{
scanf("%lld%lld", &n, &k);
for (int i = ; i <= n; i++)
scanf("%lld", &a[i]);
for (int i = ; i <= n; i++)
f[i] = inf;
while (k--)
{
memset(c, , sizeof(c));
L = ;
R = ;
tot = ;
solve(, n - , , n);
memcpy(f, g, sizeof(g));
memset(g, , sizeof(g));
}
printf("%lld\n", f[n]); return ;
}

noip模拟赛 动态规划的更多相关文章

  1. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  2. 2016-06-19 NOIP模拟赛

          2016-06-19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c ...

  3. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  4. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  5. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  6. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  7. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  8. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  9. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

随机推荐

  1. bzoj 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典【dp】

    预处理出g[i][j]表示原串第i个匹配第j个单词需要去掉几个字母(匹配不上为-1) 设f[i]为i及之后满足条件要去掉的最少字母 倒着dp! f[i]初始为f[i+1]+1,转移方程为f[i]=mi ...

  2. C#的装箱与拆箱与基本类型

    装箱:值类型转换为对象类型, 实例: int val = 8; object obj = val;//整型数据转换为了对象类型(装箱) 拆箱:之前由值类型转换而来的对象类型再转回值类型, 实例: in ...

  3. EditText(5)如何控制输入键盘的显示方式及参数表

    参考: https://developer.android.com/training/keyboard-input/visibility.html 1,进入Activity时,EditText就获得焦 ...

  4. mysql之命令行导入导出

    命令介绍 mysqldump:导出命令,在系统”命令提示符“窗口直接使用,如果提示没有此命令(前提是已经安装成功mysql),在环境变量中的path添加mysql,即path=D:\xxx\mysql ...

  5. 对比hive和mysql查询汇总

    由于底层的处理机制大不相同,hive和mysql在查询上还是有较大差异的! 单个表的select操作 最简单的查询 ,字段2 frome 表名 where 字段 [not]in(元素1,元素2): 例 ...

  6. The user specified as a definer ('root'@'%') does not exist 解决方法

    mysql> grant all privileges on *.* to root@"%" identified by "."; Query OK, r ...

  7. 2星|《约见投资人》:A股上市公司软文集

    约见资本人:58家上市公司创始人亲述创业之路 全书写了58个A股上市公司的故事,基本是宣传上市公司老总的软文.基本的套路是创始人历尽苦难创立了公司,取得了好业绩.最希望看的分析与数据几乎没有.看了一小 ...

  8. Solr搜索引擎 — 通过mysql配置数据源

    一,准备数据库数据表结构 CREATE TABLE `app` ( `id` int(11) NOT NULL AUTO_INCREMENT, `app_name` varchar(255) NOT ...

  9. IDEA SpringBoot项目连接数据库报Acess denied错误解决方法

    详见:https://blog.csdn.net/qq_36324464/article/details/79534605

  10. java虚拟机(七)--java内存模型JMM

    本文参考慕课网相关视频和博客https://mp.weixin.qq.com/s/tV0MfDdJqGwGMHCIkqnAgA,图也是这个博客的,这篇只是自己的简单总结,想要深 入理解可以访问这两块内 ...