合并 union

Description

给出一个 1 ∼ N 的序列 A ( A 1 , A 2 , ..., A N ) 。你每次可以将两个相邻的元素合并,合并后的元素权值即为 这两个元素的权值之和。求将 A 变为一个非降序列,最少需要多少步操作。

Input

输入的第一行一个整数 N ( N ≤ 5000) 。

接下来一行 N 个整数,描述序列 A 。保证序列 A 中的每个元素的值不超过 1000 。

Output

输出一行一个整数,表示最少的操作数。

Sample Input

5

9 7 5 13 15

Sample Output

1

解析

这题很明显是用DP啊啊啊!!

我们设\(f[i]\)表示将序列\(1\)~\(i\)合并的最小次数,

\(g[i]\)表示将序列\(1\)~\(i\)合后的最后一个元素的权值,

那么,从\(1\)到\(n\)枚举\(i\),

再从\(i\)~\(1\)枚举\(j\),表示将$ j\(~\)i\(合并成一个点,再添加到已经合并完后的序列\) 1\(~\)j$-\(1\)后面,

什么?你问我为什么要将$ j\(~\)i$合并成一个点?

仔细想一下,如果有一个\(k\),并且将\(j\)~\(k\)合并,再将\(k\)+$1 \(~\)i$合并后会使答案更优,

那么在枚举到\(k\)时,就会将当前情况统计一次,

而在枚举\(i\)时,当\(j\)枚举到\(k\)时,就会统计到这个答案了!!(口胡证明可能有点乱,自己画图理解下哈).

然后,我们考虑状态转移,

如果\(g[i-1]\)<=\(a[i]\)-\(a[j-1]\)(\(a\)为前缀和,表示\(i\)到\(j\)合并后的权值,整个式子就表示\(i\)到\(j\)合并后能接到\(j\)-\(1\)后面).

并且\(f[j-1]\)+\((i-j)\)<=\(f[i]\)(即次数更少,(\(i\)-\(j\))表示将\(j\)~\(i\)合并成\(1\)个点的次数),

那么我们就更新\(f[i]\)和\(g[i]\),\(g[i]\)就是\(j\)~\(i\)合成的点的权值.

那么最后,\(f[n]\)即为答案.

不清楚的看代码吧:

#include<bits/stdc++.h>
using namespace std; inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
} int n,a[100001];
int f[100001],g[100001]; int main(){
n=read();
memset(f,0x3f,sizeof(f));f[0]=0;
for(int i=1;i<=n;i++) g[i]=read();//并没什么用但也没影响,只是存一下权值
for(int i=1;i<=n;i++) a[i]=g[i]+a[i-1];//前缀和
for(int i=1;i<=n;i++){
for(int j=i;j;j--){
if(g[j-1]<=a[i]-a[j-1]){
if(f[j-1]+i-j<f[i]){//更新
f[i]=f[j-1]+i-j;
g[i]=a[i]-a[j-1];
}
}
}
}
printf("%d\n",f[n]);
return 0;
}

题解 合并 union的更多相关文章

  1. sql语句查询结果合并union all用法

    整理别人的sql 大概的思想是用union 和union all --合并重复行select * from Aunion select * from B --不合并重复行select * from A ...

  2. 【DP合集】合并 union

    给出一个 1 ∼ N 的序列 A ( A 1 , A 2 , ..., A N ) .你每次可以将两个相邻的元素合并,合并后的元素权值即为 这两个元素的权值之和.求将 A 变为一个非降序列,最少需要多 ...

  3. sql语句查询结果合并union all用法_数据库技巧

    --合并重复行 select * from A union select * from B --不合并重复行 select * from A union all select * from B 按某个 ...

  4. mysql sql语句多表合并UNION ALL和UNION

    select d1.ID,CAST(d1.ID AS CHAR) AS intId, d1.CODE_TYPE, d1.CODE, d1.CODE_IMG, d1.VALUE from m_dict_ ...

  5. LeetCoded第21题题解--合并两个有序链表

    21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出 ...

  6. 8.2.1.4 Index Merge Optimization 索引合并优化:

    8.2.1.4 Index Merge Optimization 索引合并优化: 索引合并方法是用于检索记录 使用多个 范围扫描和合并它们的结果集到一起 mysql> show index fr ...

  7. MySQL 数据底部出现总计字样 第二种办法 纵向合并 20161103

    上次在博客http://www.cnblogs.com/Mr-Cxy/p/5923375.html 我们使用了group by with rollup 函数 field自定义排序 来实现添加底部总计字 ...

  8. 并查集 (Union Find ) P - The Suspects

    Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized ...

  9. [SQL 高级查询运算符的用法 UNION (ALL),EXCEPT(ALL),INTERSECT(ALL) ]

    今天看到 三个查询运算符,给大家分享分享 为此我建立了两张表分别为 Articles 和  newArticles 我建立的时候,只建立了一张表 Articles   ,表 newArticles 是 ...

随机推荐

  1. 2019-07-31 C#基础知识学习

    什么是进程:进程是系统中正在运行的一个程序,程序一旦运行就是进程. 什么是线程:线程是进程的一个实体,是进程的一条执行路径. 进程和线程的区别体现在以下几个方面: 1.地址空间和其他资源(如打开文件) ...

  2. 【LOJ】#3092. 「BJOI2019」排兵布阵

    LOJ#3092. 「BJOI2019」排兵布阵 这题就是个背包啊,感觉是\(nms\)的但是不到0.2s,发生了什么.. 就是设\(f[i]\)为选了\(i\)个人最大的代价,然后有用的人数只有\( ...

  3. python中的with语句

    https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/index.html

  4. c语言中gets()的详细用法

    gets从标准输入设备读字符串函数.可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出. 从stdin流中读取字符串,直至接受到换行符 ...

  5. Unity Button按钮延迟

    1.把下面脚本放到Editor文件夹下,这样脚本继承Button之后,新声明的public变量才能在Inspector面板显示出来. using System.Collections; using S ...

  6. Atcoder-SoundHound Inc.Contest 2018 -Masters Tournament-比赛报告

    A C++ Example #include <iostream> #include <cstdio> #include <cstdlib> #include &l ...

  7. luogu题解 P3811 【【模板】乘法逆元】

    upd--7.6 原线性求逆元代码有另一种更优写法 题目链接: https://www.luogu.org/problemnew/show/P3811 概念: 一想到JXOI 2018考场上忘记逆元怎 ...

  8. pymssql文档(转)

    pymssql methods set_max_connections(number) -- Sets maximum number of simultaneous database connecti ...

  9. centos7上的firewalld 的使用

    #centos7上的firewalld 的使用 一.firewalld的基本启动关闭命令 启动服务------systemctl start firewalld 关闭服务------systemctl ...

  10. redis的使用(Java使用Jedis客户端连接redis)

    一.添加依赖 <dependency>   <groupId>redis.clients</groupId>   <artifactId>jedis&l ...