题面:能量项链https://www.luogu.com.cn/problem/P1063


乍一看和石子合并差不多,可是多了头值和尾值,看起来十分麻烦

我们画一张图,紫色表示头值,蓝色表示尾值。规定西边那个珠子编号为1,然后顺时针编号

很明显,我们现在要解决的是 dp [ i ] [ k ] 和 dp [ k+1 ] [ j ] 合并成的 dp [ i ] [ j ] 会变成什么样子

考虑1珠子和2珠子如果已经合并在一起,我们发现合并后的头值是1珠子的头值,合并后的尾值是2珠子的尾值

那么,是不是说dp [ i ] [  k ] 的头值就是a [ i ] ,尾值就是 a [ k+1 ] 呢

那么,是不是说 dp [ k+1 ] [ j ] 的头值就是a [ k+1 ],尾值就是 a [ j+1 ] 呢

状态转移方程就为:dp [ i ] [ j ] = max ( dp [ i ] [ j ] , dp [ i ] [ k ] + dp [ k+1 ] [ j ] + a [ i ] * a [ k+1 ] * a [ j+1 ] );

然后因为是环形,所以要扩大一倍计算。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m;
ll a[],dp[][];
int main()
{
cin>>n;
for(int i=;i<=n;i++) cin>>a[i];
for(int i=n+;i<=n*;i++)
a[i]=a[i-n];
for(int l=;l<=n;l++)
{
for(int i=;i+l-<=*n;i++)
{
int j=i+l-;
for(int k=i;k<=j-;k++)
{
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+][j]+a[i]*a[k+]*a[j+]);
// dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+a[i-1]*a[k]*a[j]);
}
}
}
ll ans=;
for(int i=;i<=n+;i++)
ans=max(ans,dp[i][i+n-]);
cout<<ans;
}

最新文章

  1. 委托的N种写法,你喜欢哪种?
  2. Linux多安全策略和动态安全策略框架演示验证方案及结果分析
  3. mysql命令导出导入数据和结构
  4. DWZ (JUI) 教程 国际化问题(多语言/语言切换)
  5. Spark机器学习 Day1 机器学习概述
  6. plsql 显式游标
  7. Andriod Studio科学文章——4.常见问题解答有关编译
  8. Android切换页面效果的实现一:WebView+ViewFlipper
  9. 数据库管理——Powershell——使用Powershell脚本找出消耗最多磁盘空间的文件
  10. putty 默认设置
  11. Linux下的Shell编程(2)环境变量和局部变量
  12. Ecplise 配置本地 https 测试
  13. 数据流中的第k大元素的golang实现
  14. tomcat启动命令行中文乱码
  15. SVN简单的使用
  16. SpringBoot 2.0集成spring-data-elasticsearch
  17. Android的TextView设置padding无效
  18. 准备dbcp2-2.1.1和pool2-2.4.2 、commons-dbcp-1.4jar包
  19. HTTP 错误 404.17 - Not Found和 HTTP 错误 404.2 - Not Found 解决办法
  20. Qt下libusb-win32的使用(二)批量读写操作

热门文章

  1. c++学习day01基础知识学习
  2. tortoise 设置beyond Compare比较工具
  3. 【学习笔记】splay入门(更新中)
  4. Go语言 2019 调查报告发布
  5. 报错:require_once cannot allocate memory----php,以前自己弄的稍微有点特殊的开发环境
  6. 9个小技巧让你的 if else看起来更优雅
  7. Linux查看端口或pid使用路径
  8. 点击 QTableView,触发事件
  9. Unity 极简UI框架
  10. 使用IBM Blockchain Platform extension开发你的第一个fabric智能合约