石子合并(NOI1995)
石子合并(NOI1995)
时间限制: 1 Sec 内存限制: 128 MB
提交: 90 解决:
48
[提交][状态][讨论版]
题目描述
在操场上沿一直线排列着
n堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的两堆石子合并成新的一堆,
并将新的一堆石子数记为该次合并的得分。允许在第一次合并前对调一次相邻两堆石子的次序。
计算在上述条件下将n堆石子合并成一堆的最小得分和初次交换的位置。
输入
输入数据共有二行,其中,第1行是石子堆数n≤100;
第2行是顺序排列的各堆石子数(≤20),每两个数之间用空格分隔。
输出
输出合并的最小得分。
样例输入
3
2 5 1
样例输出
11
看题目可以看出它是没有环的,貌似有环的石子归并也有。题目中开始可以交换相邻的两堆石子可以用枚举实现,然后就是2D/1D类型的dp
一次复杂度为O(n^3),所有总复杂度为O(n^4),这是复杂度一算为1*10^8,也就是100 million,这个还需要卡常数,在当时绝对是卡不过去的,
这时一个非常强势的优化就出现了,那就是平行四边形优化,可以缩掉一维转移的时间。
【定理 1】假如函数 w 满足上述条件,那么函数 m 也满足四边形不等式,即
m (i, j ) + m (i’, j') £ m (i', j ) + m (i , j') , i ≤ i' < j ≤ j'
我们定义 s (i , j ) 为函数 m (i , j ) 对应的决策变量的最大值
【定理 2】假如 m (i , j ) 满足四边形不等式,那么 s (i , j ) 单调,即:
s (i, j ) ≤ s (i, j +1) ≤ s (i + 1, j +1)
以上比较粗略,详细可以见
动态规划加速原理之四边形不等式 华中师大一附中 赵爽
看一下代码比较好
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<iostream> using namespace std;
const int MAXN=;
int n,ans,dp[MAXN][MAXN],a[MAXN],s[MAXN][MAXN],sum[MAXN]; void solve()
{
memset(dp,,sizeof(dp));
memset(s,,sizeof(s));
for (int i=;i<=n;i++)
{
sum[i]=a[i]+sum[i-];
dp[i][i]=;
s[i][i]=i;
}
for (int t=;t<n;t++)
for (int i=;i<=n-t;i++)
{
int j=i+t;
dp[i][j]=MAXN*MAXN*MAXN;
for (int k=s[i][j-];k<=s[i+][j];k++) //这里s即为平行四边形优化的数组
{
if (dp[i][j]>dp[i][k]+dp[k+][j]+sum[j]-sum[i-])
{
dp[i][j]=dp[i][k]+dp[k+][j]+sum[j]-sum[i-];
s[i][j]=k; //记录下i,j的最优转移点。
}
}
}
ans=min(ans,dp[][n]);
}
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
ans=MAXN*MAXN*MAXN;
solve();
for (int i=;i<n;i++)
{
swap(a[i],a[i+]);
solve();
swap(a[i],a[i+]);
}
cout<<ans<<endl;
}
石子合并(NOI1995)的更多相关文章
- P1880 [NOI1995]石子合并[区间dp+四边形不等式优化]
P1880 [NOI1995]石子合并 丢个地址就跑(关于四边形不等式复杂度是n方的证明) 嗯所以这题利用决策的单调性来减少k断点的枚举次数.具体看lyd书.这部分很生疏,但是我还是选择先不管了. # ...
- [NOI1995]石子合并 题解
一道经典的dp题 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子 ...
- 洛谷 P1880 [NOI1995]石子合并 题解
P1880 [NOI1995]石子合并 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试 ...
- 区间DP小结 及例题分析:P1880 [NOI1995]石子合并,P1063 能量项链
区间类动态规划 一.基本概念 区间类动态规划是线性动态规划的拓展,它在分阶段划分问题时,与阶段中元素出现的顺序和由前一阶段的那些元素合并而来由很大的关系.例如状态f [ i ][ j ],它表示以已合 ...
- P1880 [NOI1995]石子合并 区间dp
P1880 [NOI1995]石子合并 #include <bits/stdc++.h> using namespace std; ; const int inf = 0x3f3f3f3f ...
- 【区间dp】- P1880 [NOI1995] 石子合并
记录一下第一道ac的区间dp 题目:P1880 [NOI1995] 石子合并 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 代码: #include <iostream> ...
- [洛谷P1880][NOI1995]石子合并
区间DP模板题 区间DP模板Code: ;len<=n;len++) { ;i<=*n-;i++) //区间左端点 { ; //区间右端点 for(int k=i;k<j;k++) ...
- 洛谷 P1880 [NOI1995] 石子合并(区间DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 这道题是石子合并问题稍微升级版 这道题和经典石子合并问题的不同在于,经典的石子合 ...
- NOI1995石子合并&多种石子合并
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
随机推荐
- jQuery框架Ajax常用选项
json(JavaScript Object Notation):轻量级的数据交换(交换的数据转换成与平台无关的)格式 java对象转换成json字符串:使用ObjectMapper类的writeVa ...
- Python自学日志_2017/9/05
9月5日今天早晨学习了网易云课程<Python做Web工程师课程>提前预习课程<学会开发静态网页>.轻松的完成了第五节课的两个实战作业--感觉自己这几天的功夫没有白费,总算学会 ...
- sqlserver优化
有些程序员在撰写数据库应用程序时,常专注于 OOP 及各种 framework 的使用,却忽略了基本的 SQL 语句及其「性能 (performance)优化」问题.版工曾听过台湾某半导体大厂的新进程 ...
- 一步步带你做vue后台管理框架(二)——上手使用
系列教程<一步步带你做vue后台管理框架>第二课 github地址:vue-framework-wz 线上体验地址:立即体验 闲扯再多不会用也没白搭,这节课我来带大家直接上手框架,体验到简 ...
- 深入剖析ConcurrentHashMap二
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt200 我们关注的操作有:get,put,remove 这3个操作.对于哈希表 ...
- Python 异常处理
Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理: 本站Python教程会具体介绍. 断言 ...
- 九度OJ 1014 排名
#include <iostream> #include <string.h> #include <sstream> #include <math.h> ...
- RobotFramework安装完成后怎么在桌面显示ride图标
安装了RobotFramework后,怎么让桌面上显示带有机器人的图标呢? 一.桌面上创建ride快捷方式 进入到python的安装目录的/Scripts目录下,找到ride.py文件-->右键 ...
- 【2017集美大学1412软工实践_助教博客】团队作业9——测试与发布(Beta版本)
题目 团队作业9--测试与发布(Beta版本)(http://www.cnblogs.com/happyzm/p/6917253.html) 团队作业9-1 测试与发布成绩 分值 1 0.5 0.5 ...
- GUI记事本+切换面板1.1版
package com.niit.javagui; import java.awt.Color; import java.awt.MenuBar; import java.awt.event.Inpu ...