feat: 添加动态规划解决能量项链问题

实现动态规划算法计算将能量项链合并为一堆时的最大总能量。使用二维数组存储中间结果,通过三重循环计算所有可能的合并方式,最终输出最大能量值。
This commit is contained in:
Zengtudor 2025-08-30 12:13:29 +08:00
parent 5e23f17133
commit db685782e1

56
src/8/30/P1063.cpp Normal file
View File

@ -0,0 +1,56 @@
/*
dp[i][j]=[1,j]
dp[i][j]=max(
dp[i][j],
dp[i][k]+dp[k+1][j]+i.m*k.n*j.n
)
dp[i][j]=0
*/
#include <algorithm>
#include <cstdint>
#include <iostream>
#include <utility>
#include <vector>
using ll = int64_t;
#define pvp(v)do{\
std::cout<<#v<<":\n";\
for(const auto&i:(v)){\
std::cout<<i.first<<", "<<i.second<<"\n";\
}\
}while(0)
int main(){
ll n;
std::cin>>n;
std::vector<ll> h(2*n+1);
std::vector<std::vector<ll>> dp(2*n+1,std::vector<ll>(2*n+1));
for(ll i=1;i<=n;++i){
std::cin>>h[i];
h[n+i]=h[i];
}
// pvp(v);
for(ll len=2;len<=n;++len){
for(ll i=1;i<=2*n-len;++i){
ll j=i+len-1;
for(ll k=i;k<j;k++){
dp[i][j]=std::max(
dp[i][j],
dp[i][k]+dp[k+1][j]+h[i]*h[k+1]*h[j+1]
);
}
}
}
ll ans=0;
for(ll i=1;i<=n;i++){
ans=std::max(
ans,
dp[i][i+n-1]
);
}
std::cout<<ans<<"\n";
}