题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1021

题意:中文题诶~

思路:区间dp

我们用num[i]存储前i个元素的和,用dp[i][j]存储合并从第i个到第j个元素的代价,那么有动态转移方程式为:

dp[i][j]=min(dp[i][j], dp[i][k]+dp[k+1][j]+num[j]-num[i-1]);

还有一个问题:如果我们直接枚举i, j的话有可能我们在计算dp[i][j]时dp[k+1][j]还没计算出来,这样我们自然不能得到正确答案咯.

其实我们只要换个思路就能解决这个问题啦,我们枚举len, 和i,len表示当前合并的区间长度为len,那么j=i+len-1.

这样就不会有上面的问题啦,因为区间i,k和区间k+1,j的长度一定小于区间i, j的长度,即在计算dp[i][j]之前我们已经计算出dp[i][k]和dp[k+1][j]啦.

代码:

 #include <bits/stdc++.h>
#define MAXN 110
using namespace std; int a[MAXN], num[MAXN], dp[MAXN][MAXN]; //***dp[i][j]存储第i堆到第j堆的合并代价
const int inf=0x3f3f3f3f; int main(void){
int n, ans=;
cin >> n;
for(int i=; i<=n; i++){
cin >> a[i];
num[i]=num[i-]+a[i];
}
for(int len=; len<=n; len++){
for(int i=; i<n; i++){
int j=i+len-; //***这里要注意j可能会大于n
if(j<=n){
dp[i][j]=inf;
for(int k=i; k<j; k++){
dp[i][j]=min(dp[i][j], dp[i][k]+dp[k+][j]+num[j]-num[i-]);
}
}
}
}
cout << dp[][n] << endl;
}

最新文章

  1. Python批量扫描服务器指定端口状态
  2. DevExpress GridControl使用方法
  3. div背景图片叠加
  4. Howto: 如何将ArcGIS Server缓存移动到新服务器
  5. python 循环设计
  6. 3.Android Studio系列教程3——快捷键
  7. (一)chrome扩展 - API小记
  8. WebApi实现通讯加密
  9. 基于Vivado调用ROM IP core设计DDS
  10. [日推荐] 『闲聊助手』人工智能小程序,仅此一款!-极乐商店store.dreawer.com
  11. OSI网络模型
  12. 洛谷 P1158 导弹拦截(不是那个DP) 解题报告
  13. iframe子父窗口相互操作方法或元素
  14. oracle 将字符串转化为数值型to_number()
  15. c# 简易绘制C语言头文件包含关系图
  16. JS中的new操作符
  17. 【Linux】压缩多个文件
  18. mysql保留两位小数
  19. mysql 配置详解
  20. Tomcat下载安装及常见问题解决办法

热门文章

  1. 利用Hibernate 框架,实现对数据库的增删改查
  2. 04 - Django应用第一步
  3. POJ1041 John&#39;s trip
  4. ACM学习历程—ZOJ3777 Problem Arrangement(递推 &amp;&amp; 状压)
  5. 【Google】非下降数组
  6. python日志轮转RotatingFileHandler在django中的一个bug
  7. POJ3256:Cow Picnic
  8. POJ2528(离散化+线段树区间更新)
  9. 【转】 Pro Android学习笔记(四一):Fragment(6):数据保留
  10. 使用py 和flask 实现的服务器系统目录浏览,日志文件实时显示到网页的功能