一道区间dp的水题

题目链接

来快活啊!

思路

很简单的区间dp,思路和floyed差不多,就是需要把项链处理成环形

用\(f[l][r]\)表示以\(a[l]\)开头\(a[r]\)结尾的数串的最大和

转移方程:

\[f[l][r]=max(f[l][r],f[l][k]+f[k][r]+a[l] \cdot a[k] \cdot a[r])
\]

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<string>
#include<cstring> using namespace std;
inline int read() {
char c = getchar();
int x = 0, f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int ans;
int f[1001][1001],n,a[10010];
signed main() {
cin>>n;
for(int i=1; i<=n; ++i) {
cin>>a[i];
a[n+i]=a[i];/*处理成环*/
}
for(int i=2; i<=n+1; ++i) {
for(int l=1; l+i-1<=2*n/*注意应为2*n,因为上面处理成环了*/; ++l) {
int r=l+i-1;
for(int k=l+1; k<=l+i-2; ++k) {
f[l][r]=max(f[l][r],f[l][k]+f[k][r]+a[l]*a[k]*a[r]);
}
}
}
for(int i=1; i<=n; ++i) {
ans=max(ans,f[i][n+i]);
}
cout<<ans;
return 0;
}

最新文章

  1. LINQ to SQL Where条件
  2. Windows下安装MongoDB
  3. spring mvc4:异常处理
  4. R--基本统计分析方法(包及函数)
  5. tar 解压缩
  6. C++基础学习笔记----第四课(函数的重载、C和C++的相互调用)
  7. STM32-NVIC中断管理实现[直接操作寄存器]
  8. 《HelloGitHub》第 17 期
  9. 利用python设计PDF报告,jinja2,whtmltopdf,matplotlib,pandas
  10. 利用GDAL进行工具开源化改造
  11. Strategy 设计模式 策略模式 超靠谱原代码讲解
  12. git忽视修改的文件
  13. 减小ipa包大小
  14. android 文本框不获取焦点的两种方式
  15. 为什么IT运维工程师要学习Linux系统
  16. IDEA激活
  17. css常见效果
  18. 约跑APP测试
  19. csu 1365 双向链表模拟超时
  20. 【读书笔记】《深入浅出nodejs》第四章 异步编程

热门文章

  1. ArcGIS Engine开发鹰眼图的功能(基础篇)
  2. C# vb .net实现真实阴影特效滤镜
  3. python 跨目录访问文件
  4. Python的virtualenv管理
  5. 【转载】C#中使用int.Parse方法将字符串转换为整型Int类型
  6. jquery获取form表单中的数据
  7. Linux Samba服务器的安装
  8. Docker CMD ENTRYPOING 和Kubernetes command args对比
  9. MySQL/MariaDB数据库的触发器
  10. springboot socketio