题目大意:如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为

(Mars单位),新产生的珠子的头标记为m,尾标记为n

需要时,Mars人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项链释放出的总能量最大。

这个题就是很裸的一个区间dp题 虽然他巴拉巴拉说了一堆):
首先我们枚举一下区间 首先枚举长度 然后枚举一下左端点 右端点

这里的能量项链 既然是项链 就是个环 那处理环的区间问题的时候就把长度开为二倍,然后存的时候 i+n 存和 i 一样的东西就好了

这里注意一下枚举左端点的时候 范围应该是<=2*n - len,不然会越界

然后开始dp就好了

看题):让我们直接跳过巴拉巴拉巴拉的地方 找出我们的dp方程

所以我们的dp方程咧 那就是

解释一下 就是从l到r能取得的最大值 就是l 到 i 的最大值加i 到 r的最大值 加 i这个点连接之后爆发的能量

上代码

 #include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+; int n,a[maxn],dp[maxn][maxn],ans; int main(){
scanf("%d",&n);
for(int i = ;i <= n;++i){
scanf("%d",&a[i]);
a[i+n] = a[i];
}
for(int len = ;len <= n;++len){
for(int l = ;l <= *n - len;++l){
int r = l + len;
for(int i = l + ;i < r;++i)
dp[l][r] = max(dp[l][r],dp[l][i] + dp[i][r] + a[l]*a[i]*a[r]);
}
}
for(int i = ;i <= n;++i)ans = max(ans,dp[i][i+n]);
printf("%d",ans);
return ;
}

感谢观看

>_<

最新文章

  1. python函数基础 与文件操作
  2. recyleView使用笔记
  3. C语言链表
  4. FileSystemWatcher
  5. Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock
  6. mahout算法源码分析之Collaborative Filtering with ALS-WR (四)评价和推荐
  7. -_-#【Better Code】字符串匹配
  8. zend studio 使用断点调试
  9. 一个简单的HTTP服务器(多线程)
  10. Ubuntu16.04安装GTK3主题:OSX-Arc
  11. hibernate注解的简单应用
  12. Request的方法和数组
  13. maven配置及使用
  14. ssh多台主机实现互相认证
  15. IDM下载神器
  16. 【规范】前端编码规范——jquery 规范
  17. Codeforces 939E - Maximize!
  18. 微信小程序获取当前位置
  19. Unity Mono
  20. finally是否执行?finally何时执行?

热门文章

  1. 一篇文章看清楚 Linux 的职业发展方向
  2. Rocket - tilelink - Parameters
  3. Chisel3 - Tutorial - Parity
  4. Johnson-Trotter(JT)算法生成排列
  5. Java 第十一届 蓝桥杯 省模拟赛 计算机存储中有多少字节
  6. Java实现 LeetCode 689 三个无重叠子数组的最大和(换方向筛选)
  7. Java实现 蓝桥杯VIP 算法提高 3-1课后习题2
  8. java实现排列序数
  9. Java实现第八届蓝桥杯9算数式
  10. Django如何上传图片并对上传图片进行访问