P1063能量项链



这又是一道经典的区间DP题。
复习一下区间DP的做法。
三重循环,第一层枚举区间长度,第二层枚举起点,第三层枚举断点。
区间长度是从1到n-1(因为如果是从1到n的话,1+n≠n,所以是1到n-1)。注意这里的n就是总的元素个数(一般就是题目中给出的n,而不是处理完环变链之后的总数(2*n-1))
但是在枚举起点的时候要特别注意,要使这次枚举起点的最大值+当前枚举的区间长度=链的最后一个元素的编号。
举个栗例子:在这道题里,我们这样枚举:
for(int len=;len<=n;len++)//一开始我设的是end=st+len-1,不过等价于上面所说的len从1到n-1,end=st+len
for(int st=;st<=2*n-len+1;st++)//注意枚举的终止条件
感性理解一下ρωρ
枚举断点的时候,断点k是从st枚举到end-1(如果枚举到end,则k+1=end+1,f[end+1][end]没有实际意义)
通用的做法讲完了,来扯一下这道题
用h[i],表示i号点的头标记(head),用t[i]表示i节点的尾标记(tail),f[i][j]表示从第i个点合并到第j个点的最大得分,初始化:f[i][i]=0(因为你不需要合并,当然也没有得分)
从读入开始,就是坑。因为我们要在读入头标记的时候计算尾标记,h[i]=t[i-1]。我们注意到,点的编号从1开始,1-1是0,但是不存在0号点,所以要特判掉。并且这里还牵扯到环变链,所以也要计算h[i+n],t[i+n]。
读入完了,我们发现接下来就是一个标准的区间DP板子,只需要注意上面所提到的枚举的起止点就可以了。
递推式:f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+h[i]*t[k]*t[j])
最后答案注意不是f[1][n],而是在f[i][i+n-1](1<=i<=n)中选择最大值(不一定要从1节点开始合并)
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,h[N*],t[N*],f[N*][N*];
int read()//快读
{
char ch=getchar();
int x=;bool f=;
while(ch<''||ch>'')
{
if(ch=='-')f=;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=(x<<)+(x<<)+(ch^);
ch=getchar();
}
f?x=-x:x=x;
return x;
}
int main()
{
n=read();
for(int i=;i<=n;i++)
{
h[i]=read();
int r=i-;if(r==)r=n;//pay attention
t[r]=h[i];
h[i+n]=h[i];
t[r+n]=t[r];
}
for(int len=;len<=n;len++)//len=r-l+1
{
for(int st=;st<=*n-len+;st++)//注意一下
{
int end=st+len-;
for(int k=st;k<end;k++)
{
f[st][end]=max(f[st][end],f[st][k]+f[k+][end]+h[st]*t[k]*t[end]);
}
}
}
int maxn=-;
for(int i=;i<=n;i++)
maxn=max(maxn,f[i][i+n-]);//找答案
printf("%d",maxn);
}
P1063能量项链的更多相关文章
- 【洛谷】P1063 能量项链【区间DP】
P1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子, ...
- 洛谷——P1063 能量项链
P1063 能量项链 题目描述 在MarsMars星球上,每个MarsMars人都随身佩带着一串能量项链.在项链上有NN颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对 ...
- 『题解』洛谷P1063 能量项链
原文地址 Problem Portal Portal1:Luogu Portal2:LibreOJ Portal3:Vijos Description 在\(Mars\)星球上,每个\(Mars\)人 ...
- 洛谷 P1063 能量项链 题解
P1063 能量项链 题目描述 在\(Mars\)星球上,每个\(Mars\)人都随身佩带着一串能量项链.在项链上有\(N\)颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并 ...
- 区间DP小结 及例题分析:P1880 [NOI1995]石子合并,P1063 能量项链
区间类动态规划 一.基本概念 区间类动态规划是线性动态规划的拓展,它在分阶段划分问题时,与阶段中元素出现的顺序和由前一阶段的那些元素合并而来由很大的关系.例如状态f [ i ][ j ],它表示以已合 ...
- luogu P1063 能量项链 x
P1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子, ...
- 洛谷P1063 能量项链 [2006NOIP提高组]
P1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标 记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子 ...
- 洛谷 P1063 能量项链
题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...
- P1063 能量项链 区间dp
题目描述 在MarsMars星球上,每个MarsMars人都随身佩带着一串能量项链.在项链上有NN颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一 ...
- 洛谷P1063 能量项链(区间DP)(环形DP)
To 洛谷.1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的 ...
随机推荐
- Mac016--安装kubernetes(k8s)
一.安装kubernetes(k8s) 参考: http://batizhao.github.io/2018/01/18/Running-Kubernetes-Locally-via-Minikube ...
- thead tbody tfoot
<!DOCTYPE html> <html lang="en"> <head> <title>Title</title> ...
- 多线程02-Join
; i < ; i++) { Console.WriteLine(i); } Co ...
- 基于Filter实现Gzip数据压缩
在web开发中,当服务器端向客户端返回的数据量比较大时,我们可以通过Gzip对数据进行压缩处理 注意:如果小数据量进行压缩,压缩后的数据可能比原始数据还大:所以response返回数据量比较小时不推荐 ...
- El 表达式和 Jstl 标签库
El 表达式学习 1. 什么是 EL 表达式 全称:Expression Language,一种写法非常简介的表达式.语法简单易懂,便于使用.表达式语言的灵感来自于 ECMAScript 和XPath ...
- 百度文档,用Python一键免费下载
百度文库下载需要券,或者vip才能下载 Vip价格高,偶尔下载一次不划算. 不下载复制?不好意思复制也需要vip否则只能一次复制两行. 如何才能以最低成本获取到百度文库里的文档内容呢? 当然是用Pyt ...
- zTree根节点默认打开
1.在生成tree的json数据中,直接给出:open:true的属性; 2.treeObj.expandAll(true); 3.var zTree = $.fn.zTree.getZTreeObj ...
- python 安装 pip ,并使用pip 安装 filetype
闲话少说,直接上操作. python版本为2.7.6 可以直接到官网下载,我也提供一个百度云的下载地址 https://pan.baidu.com/s/1kWPXG8Z 这个是window版本,lin ...
- 2、Jmeter测试
一.测试流程 1.添加本次测试计划 (右键-->添加-->Threads(Users)-->线程组) 2.设置线程数 (所谓线程数就是并发用户数) 3.在线程组内添加请求(右键--& ...
- whetstone
https://www.cnblogs.com/findumars/p/4173040.html 下载源码:http://www.netlib.org/benchmark/whetstone.c ar ...