The city of D consists of n towers, built consecutively on a straight line. The height of the tower that goes i-th (from left to right) in the sequence equals hi. The city mayor decided to rebuild the city to make it beautiful. In a beautiful city all towers are are arranged in non-descending order of their height from left to right.

The rebuilding consists of performing several (perhaps zero) operations. An operation constitutes using a crane to take any tower and put it altogether on the top of some other neighboring tower. In other words, we can take the tower that stands i-th and put it on the top of either the (i - 1)-th tower (if it exists), or the (i + 1)-th tower (of it exists). The height of the resulting tower equals the sum of heights of the two towers that were put together. After that the two towers can't be split by any means, but more similar operations can be performed on the resulting tower. Note that after each operation the total number of towers on the straight line decreases by 1.

Help the mayor determine the minimum number of operations required to make the city beautiful.

Input

The first line contains a single integer n (1 ≤ n ≤ 5000) — the number of towers in the city. The next line contains n space-separated integers: the i-th number hi (1 ≤ hi ≤ 105) determines the height of the tower that is i-th (from left to right) in the initial tower sequence.

Output

Print a single integer — the minimum number of operations needed to make the city beautiful.

Example

Input
5
8 2 7 3 1
Output
3
Input
3
5 2 1
Output
2
题意: 给出n个正整数,进行若干个操作,使得序列非减,求最少的操作次数;
            操作:
                    每次可以选择两个相邻的数合并为一个;
 
解法:
         (1) dp[i][j]表示 前i个整数合并成非减序列的最小代价,且最后一段区间为j->i
         (2) 枚举最后一段合并的区间;

dp(i)表示使得前i个塔美丽的最小操作次数,sum(i)表示前i座塔的前缀和,last(i)表示使得前i个塔美丽操作次数最小的情况下,最右侧一座塔最小的塔高。

那么就有状态转移方程:dp(i)=min{dp(j)+i-j+1},sum(i)-sum(j)>=last(j).

#include <cstdio>
int dp[],sum[],last[];
int main()
{
int n;
scanf("%d",&n);
for(int i = ;i <= n;i++){
int a;
scanf("%d",&a);
sum[i] = sum[i-]+a;
dp[i] = last[i] = <<;
}
for(int i = ;i <= n;i++){
for(int j = ;j < i;j++){
if(sum[i]-sum[j] >= last[j] && dp[i] >= dp[j]+i-j-){
dp[i] = dp[j]+i-j-;
if(last[i] > sum[i]-sum[j]) last[i] = sum[i]-sum[j];
}
}
}
printf("%d\n",dp[n]);
return ;
}
原文地址http://blog.sina.com.cn/s/blog_140e100580102wkl5.html

最新文章

  1. tomcat远程调试javaweb
  2. Android Studio 2.2.2 发布
  3. 0.AutoMapper核心
  4. C#之不借助第三变量交换两变量值
  5. Cannot locate factory for objects of type DefaultGradleConnector, as ConnectorServiceRegistry has been closed.
  6. Python_技巧系列
  7. 2014年IT互联网行业薪酬待遇
  8. Navicat 看历史执行SQL
  9. laravel5验证码
  10. Content related to smartcards (and RFID/NFC)
  11. mysql修改用户名和密码
  12. C# 标签(条码)
  13. [置顶] 从引爆点的角度看360随身wifi的发展
  14. 爬虫代码实现五:解析所有分页url并优化解析实现类
  15. 使用紧凑的序列化器,数倍提升性能 —— ESFramework 4.0 快速上手(11)
  16. [国嵌笔记][028][Bootloader设计蓝图]
  17. memcached安装、使用
  18. C++/C实现各种排序算法(持续更新)--冒泡排序,选择排序,归并排序
  19. Tomcat调试404错误
  20. Android人脸识别App(带web上传注册信息)

热门文章

  1. 用JS制作一个信息管理平台完整版
  2. ACM学习之路___HDU 5723(kruskal + dfs)
  3. Python之面向对象与类
  4. 再起航,我的学习笔记之JavaScript设计模式26(解释器模式)
  5. [js高手之路] html5 canvas动画教程 - 实时获取鼠标的当前坐标
  6. ADALINE模型
  7. Relocation 状态压缩DP
  8. Python文件读写模式
  9. ViewData 不可以有特殊字符,比如. ,等只允许数字字符和空格
  10. webpack2使用ch6-babel使用 处理es6 优化编译速度