能量项链(动态规划)

题目描述
在这里插入图片描述
输入格式

在这里插入图片描述
**输出格式**
诸如此类不能线性规划的问题要用到区间DP,区间DP一般就是三层循环,第一层表示区间长度(本题即n),第二层枚举起点并根据第一层区间长度算出区间终点,第三层便在当前区间内枚举决策(即哪两个合并)

本题由于是环,还需破环为列,可以开两倍大的数组,即a[i]=a[i+n],便可在第n颗珠子时求到第1颗珠子的头标记(也即第n颗珠子的尾标记)

合并珠子即合并左珠dp[i][k]和右珠dp[k+1][j],释放能量a[i]∗a[k+1]∗a[j+1](注意a[i]存放的是第i颗珠子的头标记,所以a[k+1]才是第k个珠子的尾标记)

#include<bits/stdc++.h>
using namespace std;
const int N=222;
using namespace std;
int n,a[N],dp[N][N],ans;
int main() {
	cin>>n;
	for(int i=1; i<=n; i++)
		cin>>a[i],a[i+n]=a[i];
	for(int len=2; len<=n; len++)//枚举区间长度
		for(int i=1; i+len-1<n*2; i++) {//枚举区间起点
			int j=i+len-1;
			for(int k=i; k<j; k++)//枚举决策
				dp[i][j]=max(dp[i][j], dp[i][k]+dp[k+1][j]+a[i]*a[k+1]*a[j+1]);
		}
	for(int i=1; i<=n; i++)//枚举可能的答案
		ans=max(dp[i][i+n-1],ans);
	cout<<ans<<endl;
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值