class Solution {
public:
int mctFromLeafValues(vector<int>& arr) {
int N = arr.size();
int dp[N+1][N+1]; // dp[L][R];
int mx[N+1][N+1]; // mx[L][R];
memset(dp,0x3f,sizeof(dp));
memset(mx,0,sizeof(mx));
// 枚举左边界
for(int l=N-1;l>=0;l--){
// 枚举右边界
dp[l][l] = 0;
mx[l][l] = arr[l];
for(int r=l+1;r<N;r++){
mx[l][r] = max(mx[l][r-1],arr[r]);
// 枚举划分
for(int k=l+1;k<=r;k++){
dp[l][r] = min(dp[l][r],dp[l][k-1] + dp[k][r] + mx[l][k-1] * mx[k][r]);
}
}
}
return dp[0][N-1];
}
};
No.52 - LeetCode1130 - 区间dp - 数组最小乘积和
最新推荐文章于 2023-02-25 23:03:36 发布
本文介绍了一个使用C++实现的动态规划算法,通过枚举左边界、右边界和划分,解决了一个特定的数学问题。算法首先初始化dp和mx二维数组,然后通过三层循环进行动态规划状态转移,最终返回dp[0][N-1]作为最优解。
5万+

被折叠的 条评论
为什么被折叠?



