传送

这又是一道经典的区间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);
}

最新文章

  1. 使用delphi+intraweb进行微信开发4—微信消息加解密
  2. android 中resources管理
  3. JavaScriptOO.com – 快速找到你需要的 JS 框架
  4. python 深拷贝与浅拷贝
  5. WIN7系统自带截图工具SnippingTool
  6. How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新)
  7. 配置Java环境-20160613
  8. 李洪强iOS开发之让您的Xcode键字如飞
  9. android新建项目时 出现appcompat_v7工程错误和红色感叹号
  10. nginx反向代理取得IP地址
  11. 火币网现货API[Python3版]
  12. java中throw与throws
  13. Docker常用镜像
  14. 死磕 java集合之ArrayList源码分析
  15. error LNK1169 找到一个或多个多重定义的符号的解决方法
  16. mysql各种操作记录
  17. windows安装centos7子系统
  18. zabbix安装脚本
  19. day29-序列化 json、pickle、shelve
  20. js基础学习笔记(零七)

热门文章

  1. hive Hbase sql
  2. [面試題]C符號的優先順序
  3. free野指针问题
  4. HTTP 几种常用的认证机制
  5. Windows下的Linux子系统安装,WSL 2下配置docker
  6. keepalived的配置文件
  7. 初学Java 二维数组找出最近的两个点
  8. 树——sum-root-to-leaf-numbers(根到叶节点数字之和)
  9. BZOJ3129/洛谷P3301方程(SDOI2013)容斥原理+扩展Lucas定理
  10. sass @import 规则