HDU3506环形石子合并问题
线性的石子合并问题比较好理解,环形的转成线性的方法就是扩展数组
1 2 3 . . . n 1 2 3 ... n
依据是我们最优的取值可以是 1 --- n也能是 2 --- n + 1,所以完全可以线性来做
for(int i = 1;i <= 2 * n;i++)
{
if(i <= n) scanf("%d",&a[i]);
else a[i] = a[i-n]; sum[i] = sum[i-1] + a[i];
}
都快忘记了线性石子合并的问题了
未涉及四边形不等式优化前
dp[i][j]表示i到j元素区间内的权值和,sum[i][j]辅助dp[i][j]的状态转移
dp[i][j] = dp[i][k] + dp[k + 1][j] + sum[i][j]
所以我们枚举起点i之前要枚举区间的长度 l
最后应用上四边形不等式
先来看看初始化问题
for(int i = 0;i <= 2*n;i++)
{
dp[i][i] = 0;
s[i][i] = i;
s[2*n][i] = 2 * n;
}
dp[i][i]仅仅一个元素权值为0——————权值根据题意来计算
s[i][i] 最优分界点 k = i
s[2*n][i] = 2 * n; 防止越界,规定一个上界,最高值也就是 2* n
好的,差不多啦,四边形不等式做到现在用的也很熟练了,还是得多练啊
/*
做的快忘得也挺快啊
石子问题
dp[i][j]表示的事从i到j的最优值
如何遍历j呢,就需要遍历区间的长度啦长度为1是无效的
*/ #include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
#define inf (1 << 30)
using namespace std;
const int maxn = 2 * (1e3 + 10);
int dp[maxn][maxn];
int s[maxn][maxn];
int a[maxn];
int sum[maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
sum[0] = 0;
for(int i = 1;i <= 2 * n;i++)
{
if(i <= n) scanf("%d",&a[i]);
else a[i] = a[i-n]; sum[i] = sum[i-1] + a[i];
} for(int i = 0;i <= 2*n;i++)
{
dp[i][i] = 0;
s[i][i] = i;
s[2*n][i] = 2*n;
} for(int l = 2;l <= n;l++)//区间长度
{
for(int i = 2 * n + 1 - l;i >= 1;i--)//起点
{
int j = i + l - 1;//终点
dp[i][j] = inf;
for(int k = s[i][j-1];k <= s[i+1][j];k++)
{
int tmp = dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1];
if(dp[i][j] > tmp)
{
dp[i][j] = tmp;
s[i][j] = k;
}
}
}
}
int ans = inf;
for(int i = 1;i <= n;i++)
{
ans = min(ans,dp[i][i + n - 1]);
}
printf("%d\n",ans);
}
return 0;
}
HDU3506环形石子合并问题的更多相关文章
- HDU 3506 (环形石子合并)区间dp+四边形优化
Monkey Party Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Tot ...
- HDU-3506 Monkey Party (环形石子合并)
题目大意:n堆石子围成一圈,每堆石子的块数已知,每次可以将相邻的两堆合并到一堆,块数变为两堆之和,代价也为两堆石子块数之和.求合并到一堆的最小代价. 题目分析:先通过将前n-1依次个移到第n个后面,将 ...
- RQNOJ 490 环形石子合并
题目链接:https://www.rqnoj.cn/problem/490 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一 ...
- 洛谷P1880 石子合并(环形石子合并 区间DP)
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- dp——环形石子合并(区间dp)
环形的解决很巧妙 #include <iostream> #include <cstring> #include <string> #include <map ...
- 四边形不等式优化_石子合并问题_C++
在动态规划中,经常遇到形如下式的状态转移方程: m(i,j)=min{m(i,k-1),m(k,j)}+w(i,j)(i≤k≤j)(min也可以改为max) 上述的m(i,j)表示区间[i,j]上的某 ...
- HRBUST - 1819 石子合并问题--圆形版(区间dp+环形+四边形优化)
石子合并问题--圆形版 在圆形操场上摆放着一行共n堆的石子.现要将石子有序地合并成一堆.规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆石子数记为该次合并的得分.请编辑计算出将n堆石子合并成一堆的 ...
- Luogu【P1880】石子合并(环形DP)
先放上luogu的石子合并题目链接 这是一道环形DP题,思想和能量项链很像,在预处理过程中的手法跟乘积最大相像. 用一个m[][]数组来存储石子数量,m[i][j]表示从第 i 堆石子到第 j 堆石子 ...
- P1880 [NOI1995]石子合并[环形DP]
题目来源:洛谷 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将 ...
随机推荐
- java 字符串截取类 区分中文、英文、数字、标点符号
package com.founder.fix.ims; /** * @author WANGYUTAO * 操作字符串 */ public class SubString { // public s ...
- andorid 全部对话框
.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...
- [翻译]Javaslang 介绍
原文地址:Introduction to Javaslang 1. 概述 在这篇文章中,我们将会探讨: Javaslang 是什么? 为什么需要它? 以及怎样在项目中使用它? Javaslang 是J ...
- sys安装
1.将SYS驱动文件放到系统目录的SYSTEM32目录中.2.按WIN+R组合键,在运行框中输入:regsvr32 sys所在全路径,点击确定即可.
- JSP指令(page include taglib)
JSP指令指示JSP转换器如何翻译JSP页面到Servlet:JSP指令用来设置整个JSP页面相关的属性,如网页编码方式.脚本语言等 JSP指令的格式: <%@ directive attrib ...
- qr 生成二维码
package com.common; import com.swetake.util.Qrcode; import jp.sourceforge.qrcode.QRCodeDecoder; impo ...
- mybatis 一次执行多条语句
现在的一些互联网应用 为了提高性能,现在一般比较少的使用外键.不是不用,只是在创建数据库不标明外键关系,用程序去维护. 为了维护数据一致性,我们需要手动完成相关数据的删除 比如用户和用户的关注 当用户 ...
- 【转】再讲IQueryable<T>,揭开表达式树的神秘面纱
[转]再讲IQueryable<T>,揭开表达式树的神秘面纱 接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个 ...
- Twitter 相关APP开发
首先要获取 Consumer Key (API Key), Consumer Secret (API Secret):最好申请Access Token 和Access Token Secret,不然验 ...
- python学习 day22 (3月29日)----(生成器推导式)
新手上路请多担待 1 2 封装 3 私有化封装 #__author : 'liuyang' #date : 2019/3/29 0029 上午 9:35 # 不想让别人看 修改 我的属性 # 源码来说 ...