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 - 数组最小乘积和
最新推荐文章于 2024-06-30 16:35:15 发布