合并 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. (5.15)mysql高可用系列——MHA实践

    关键词:MHA,mysql mha [1]需求 采用mysql技术,实现MHA高可用主从环境,预计未来数据量几百G MHA概念参考:MYSQL高可用技术概述 [2]环境技术架构 [2.1]MHA简介 ...

  2. Oracle导入/导出某个用户下的数据库

    导出 exp用户名/密码@数据库实例owner=用户名file=文件存储路径 例如:exp MM/123456@ORCL owner=MM file=F\abcd.dmp 导入 imp用户名/密码@数 ...

  3. strCmd.Format("delete FROM userTable where name = '%s'", name);

    string.Format("select * from 数据库表 where 用户名='%s' and 密码='%s' ",m_1,m_2); 把[m_1]和[m_2]的值按照[ ...

  4. 使用python的ctypes库实现内存的动态申请和释放

    1.申请前内存占用情况 2.申请内存 from ctypes import * import time #在这里申请1G的内存,单位k mem = create_string_buffer(1024* ...

  5. MySQL中导入Excel表格中的数据

    在数据库中建立好响应的数据库.表(参考excel表格中列中的名字和内容): 将excel表格另存为txt文件,选择“文本文件(制表符分割)”: 打开相应的txt文件,只留下要导入的数据(windows ...

  6. java线程的方便调用方式

    一直用java的线程,总感觉写起来阅读或书写起来不是方便,改进之. 实现类: public class Task<R> { private ExecutorService executor ...

  7. charles 抓包 (二)

    本文基于charles 抓包 https (1)中的配置完成. 1.移动设备上的网络请求 打开要调试的APP,请求就会先发送到Charles,然后验证是否允许访问. 当点击允许后,可以在Proxy - ...

  8. 关闭钩子(shutdown hook)的作用以及在Tomcat中的使用

    在很多实际应用环境中,当用户关了应用程序时,需要做一些善后清理工作,但问题是,用户有时并不会按照推荐的方法关闭应用程序,很有可能不做清理工作,例如在Tomcat的部署应用中,通过实例化一个Server ...

  9. asp.net 10 Cookie & Session

    Cookie 1.什么是Cookie 一小段文本,明文的数据,关于网站相关的文本字符串数据.一个客户端状态保持机制~ 存储在客户端的浏览器内存里面或者磁盘(如果不指定过期时间,那么存储在客户端浏览器内 ...

  10. B-Tree和 B+Tree的数据存储结构

    B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的.在讲B ...