经典:区间dp-合并石子
题目链接 :http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737
这个动态规划的思是,要得出合并n堆石子的最优答案可以从小到大枚举所有石子合并的最优情况,例如要合并5堆石子就可以从,最优的2+3和1+4中得到最佳的答案。从两堆最优到三堆最优一直到n堆最优。
状态转移方程式:dp [ i ] [ j ] = min(dp [ i ] [ k ] + dp [ k+1 ] [ j ])
复杂度为o(n^3)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 210;
int dp[maxn][maxn],sum[maxn];
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
int now;
scanf("%d",&now);
sum[i] = sum[i-1] + now;
}
for(int l=2;l<=n;l++)//从i开始长度为l合并的最优答案
for(int i=1;i<=n-l+1;i++)
{
int j = i + l - 1;
dp[i][j] = 0x7f7f7f7f;
for(int k=i;k<=j;k++)
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
}
printf("%d\n",dp[1][n]);
}
return 0;
}
经过平行四边形优化之后复杂度为o(n^2)
平行四边形优化https://baike.baidu.com/item/%E5%9B%9B%E8%BE%B9%E5%BD%A2%E4%B8%8D%E7%AD%89%E5%BC%8F?fr=aladdin
/*由平行四边形原理可得,s[i-1][j]<=s[i][j]<=s[i+1][j]*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 210;
int dp[maxn][maxn],sum[maxn],s[maxn][maxn];
void init(int n)
{
memset(dp,0,sizeof(dp));
memset(s,0,sizeof(s));
for(int i=1;i<=n;i++)
{
int now;
scanf("%d",&now);
s[i][i] = i;
sum[i] = sum[i-1] + now;
}
}
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
init(n);
for(int l=2;l<=n;l++)
for(int i=1;i<=n-l+1;i++)
{
int j = i+l-1;
dp[i][j] = 0x7f7f7f7f;
for(int k=s[i][j-1];k<=s[i+1][j];k++)
{
if(dp[i][j] > dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1])
{
dp[i][j] = dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1];
s[i][j] = k;
}
}
}
printf("%d\n",dp[1][n]);
}
return 0;
}
经典:区间dp-合并石子的更多相关文章
- nyoj737区间dp(石子合并)
石子合并(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的 ...
- 区间dp之 "石子合并"系列(未完结)
A. 石子合并<1> 内存限制:128 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统评测 方式:文本比较 题目描述 有N堆石子排成一排(n<=100),现要将石 ...
- 2017北京网络赛 J Pangu and Stones 区间DP(石子归并)
#1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...
- POJ 1160 经典区间dp/四边形优化
链接http://poj.org/problem?id=1160 很好的一个题,涉及到了以前老师说过的一个题目,可惜没往那上面想. 题意,给出N个城镇的地址,他们在一条直线上,现在要选择P个城镇建立邮 ...
- nyoj 737 石子合并 经典区间 dp
石子合并(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆 ...
- hihocoder1636 Pangu and Stones(区间DP(石子合并变形))
题目链接:http://hihocoder.com/problemset/problem/1636 题目大意:有n堆石头,每次只能合并l~r堆,每次合并的花费是要合并的石子的重量,问你合并n堆石子的最 ...
- 整数划分——区间dp(石子合并)
这不是将一个数以一来划分,而是把一个整数以位来划分 题目描述 如何把一个正整数N(N长度<20)划分为M(M>1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式 ...
- poj 1390 Blocks (经典区间dp 方块消除)
Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4250 Accepted: 1704 Descriptio ...
- ZOJ 3541 The Last Puzzle(经典区间dp)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3541 题意:有一排开关,有个开关有两个值t和d,t是按下开关后在t秒后会自 ...
- 最大 k 乘积问题 ( 经典区间DP )
题意 : 设 NUM 是一个 n 位十进制整数.如果将 NUM 划分为 k 段,则可得到 k 个整数.这 k 个整数的乘积称为 NUM 的一个 k 乘积.试设计一个算法,对于给定的 NUM 和 k,求 ...
随机推荐
- Codeforces Round #541 (Div. 2) C.Birthday
链接:https://codeforces.com/contest/1131/problem/C 题意: 求给的n个数,相邻差值最小的排列方式.1-n相邻. 思路: sort后隔一个取一个,取到底后再 ...
- 使用高性能Pipelines构建.NET通讯程序
.NET Standard支持一组新的API,System.Span, System.Memory,还有System.IO.Pipelines.这几个新的API极大了提升了.NET程序的效能,将来.N ...
- Spring+Quartz配置定时任务
一.Quartz介绍 在企业应用中,我们经常会碰到时间任务调度的需求,比如每天凌晨生成前天报表,每小时生成一次汇总数据等等.Quartz是出了名的任务调度框架,它可以与J2SE和J2EE应用程序相结合 ...
- 535 Encode and Decode TinyURL 编码和解码精简URL地址
详见:https://leetcode.com/problems/encode-and-decode-tinyurl/description/ C++: class Solution { public ...
- 安装wamp时出现httpd.exe无法找到组件MSVCR100.dll的解决办法
很多朋友在安装wamp server时会出现以下错误,安装之后无法启动httpd.exe服务. --------------------------- httpd.exe - 无法找到组件 ----- ...
- [转]nopcommerce之权限模块
本文转自:http://www.nopchina.net/category/%E6%9E%B6%E6%9E%84.html 这篇文章简单介绍一下nopcommerce的权限模块,nopcommerce ...
- hdu6118 度度熊的交易计划
思路: 将生产和运输费用视作产出,将销售获利视作投入,计算最小费用可行流(不一定是最大流).注意片区之间的高速公路是双向边. 实现: #include <iostream> #includ ...
- datagrid数据网格获取所有选中行的索引,插入某个列值为其他列的运算值
获取所有选中行的索引,存入数组ary中: var data=$("#dg").datagrid("getSelections"); var ary=[]; fo ...
- IE浏览器兼容background-size
background-size是CSS3新增的属性,IE8以下不支持,通过滤镜实现background-size效果 background-size:contain; // 缩小图片来适应元素的尺寸( ...
- mui开发中获取单选按钮、复选框的值
js获取单选按钮的值 function getVals(){ var res = getRadioRes('rds'); if(res == null){mui.toast('请选择'); retur ...