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个算法,计算出将 ...
随机推荐
- Intellij IDEA 快捷键整理-鬼畜版(全键盘开发指南)
一 .何为鬼畜? 鬼畜一词在ACG爱好者中也代指通过影片(或音讯)剪辑,用频率极高的重复画面(或声音)组合而成的一段节奏配合音画同步率极高的一类影片,而这类鬼畜影片多见于NICONICO.AcFun和 ...
- 清晰易懂!关于PS入门的超详细笔记!
给大家分享一篇关于PS入门的超详细笔记!原理讲解清晰明了,虽不是新版本解析,但都是新手学习PS必掌懂的一些知识点,灰常的实用,转走收藏学习! 编辑:千锋UI设计 来源:PS学堂
- Docker虚拟化实战学习——基础篇(转)
Docker虚拟化实战学习——基础篇 2018年05月26日 02:17:24 北纬34度停留 阅读数:773更多 个人分类: Docker Docker虚拟化实战和企业案例演练 深入剖析虚拟化技 ...
- Python之路(第四篇):Python基本数据类型列表、元组、字典
一.列表 1.列表 list ,是一个类,li = [1,2,"nicholas"] li是通过list类创建的对象. 2.list特点: 用中括号括起来,用逗号分割每个元素,列表 ...
- ssrf绕过总结
前言 昨天忘了在公众号还是微博上看到的了,看到一个SSRF绕过的技巧,使用的是 ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ 绕过的,自己也没遇到过.然后想想自己对SSRF绕过还是停留在之前的了解,也没学习过新的绕过方法, ...
- LFI/RFI总结
目录 0×01 文件包含简介 服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间.这意味着您可以创建供所有网页引用的标准页眉或菜单 ...
- python的杨辉三角
# # / \ # # / \ / \ # # / \ / \ / \ # # / \ / \ / \ / \ # # / \ / \ / \ / \ / \ # # ---------------- ...
- proguard-rules.pro、混淆、导jar包
前记: 买了一个<精通Android Studio>本来最想看的是关于混淆导jar包的,哪知道没有,有点小失望. 好吧,自己来. 在用Android Studio开发的时候,把minify ...
- jquery单行文字上下循环滚动
html代码: <div class="box"> <div class="t_news"> <b>已关联奖励账号.昵称:& ...
- linux_添加一个普通用户
useradd 用户名 passwd 密码 su 用户名 可以切换用户 exit 返回之前登录的用户 sodu用户 --> 不用告诉普通用户root的密码 可以查看所有的系统文件 包括root下 ...