51nod1021(区间dp)
2024-08-31 17:06:02
题目链接: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;
}
最新文章
- Python批量扫描服务器指定端口状态
- DevExpress GridControl使用方法
- div背景图片叠加
- Howto: 如何将ArcGIS Server缓存移动到新服务器
- python 循环设计
- 3.Android Studio系列教程3——快捷键
- (一)chrome扩展 - API小记
- WebApi实现通讯加密
- 基于Vivado调用ROM IP core设计DDS
- [日推荐] 『闲聊助手』人工智能小程序,仅此一款!-极乐商店store.dreawer.com
- OSI网络模型
- 洛谷 P1158 导弹拦截(不是那个DP) 解题报告
- iframe子父窗口相互操作方法或元素
- oracle 将字符串转化为数值型to_number()
- c# 简易绘制C语言头文件包含关系图
- JS中的new操作符
- 【Linux】压缩多个文件
- mysql保留两位小数
- mysql 配置详解
- Tomcat下载安装及常见问题解决办法
热门文章
- 利用Hibernate 框架,实现对数据库的增删改查
- 04 - Django应用第一步
- POJ1041 John&#39;s trip
- ACM学习历程—ZOJ3777 Problem Arrangement(递推 &;&; 状压)
- 【Google】非下降数组
- python日志轮转RotatingFileHandler在django中的一个bug
- POJ3256:Cow Picnic
- POJ2528(离散化+线段树区间更新)
- 【转】 Pro Android学习笔记(四一):Fragment(6):数据保留
- 使用py 和flask 实现的服务器系统目录浏览,日志文件实时显示到网页的功能