能量项链 (洛谷)(区间DP)

本文详细解析了一道经典的区间动态规划题目,通过定义状态dp(i,j)表示合并i到j区间所能获得的最大值,其中头节点为w(i),尾节点为w(j+1)。文章展示了如何利用小范围区间向大范围区间转移的方法来解决问题,并给出了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址
附属于博客

#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;

const int INF = 0x3f3f3f3f;
const double eps = 1e-5;
const int N = 1e3 + 10;
const int mod = 10007;

/*
	dp(i,j) 表示合并i,j得到的最大值 头节点为w(i),尾节点为w(j+1) 
	对于dp(i,j) 可以由 dp(i,k)+dp(k+1,j)+w(i)*w(k+1)*w(j+1) 得到。
	满足区间性质,由小区间向大区间转移。 
	
*/ 

int dp[N][N],w[N]; 

signed main(){
	IOS
    int n; cin>>n;
    for(int i=1;i<=n;i++) cin>>w[i],w[i+n]=w[i];
    for(int len=2;len<=n;len++)
    	for(int l=1;l<=n+n-len+1;l++){
    		int r = l + len - 1;
    		for(int k=l;k<r;k++)
    			dp[l][r] = max(dp[l][r],dp[l][k]+dp[k+1][r]+(w[l]*w[k+1]*w[r+1]));
		}
	int ans = 0;
	for(int i=1;i<=n+1;i++) ans = max(ans,dp[i][i+n-1]);
	cout<<ans<<endl;
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值