P1063 [NOIP 2006 提高组] 能量项链(区间dp)
P1063 [NOIP 2006 提高组] 能量项链
题目描述
在 Mars 星球上,每个 Mars 人都随身佩带着一串能量项链。在项链上有
需要时,Mars 人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项链释放出的总能量最大。
例如:设
这一串项链可以得到最优值的一个聚合顺序所释放的总能量为:
输入格式
第一行是一个正整数
至于珠子的顺序,你可以这样确定:将项链放到桌面上,不要出现交叉,随意指定第一颗珠子,然后按顺时针方向确定其他珠子的顺序。
输出格式
一个正整数
输入输出样例 #1
输入 #1
4
2 3 5 10
输出 #1
710
说明/提示
NOIP 2006 提高组 第一题
这道题l应该<=n+i而不是n+i-1,不知道为什么,并且len可以到n+1,保存答案时也是i到i+n;
#include<iostream>
#define int long long
using namespace std;
const int N=500;
int a[N];
int f[N][N];
int MAX=-0x3f;
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i+n]=a[i];
}
for(int i=1;i<=n;i++){
for(int len=3;len<=n+1;len++){
for(int l=i;l+len-1<=n+i;l++){
int r=l+len-1;
for(int k=l+1;k<r;k++){
f[l][r]=max(f[l][r],f[l][k]+f[k][r]+a[l]*a[k]*a[r]);
}
}
}
MAX=max(MAX,f[i][i+n]);
}
cout<<MAX;
return 0;
}
分类:
动态规划 / 区间dp
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理