leetcode1130 Minimum Cost Tree From Leaf Values

思路:

区间dp。

实现:

 1 class Solution
 2 {
 3 public:
 4     int mctFromLeafValues(vector<int>& arr)
 5     {
 6         int n = arr.size();
 7         vector<vector<int>> maxn(n, vector<int>(n, 0));
 8         for (int i = n - 1; i >= 0; i--)
 9         {
10             for (int j = i; j < n; j++)
11             {
12                 if (j == i) maxn[i][j] = arr[i];
13                 else
14                 {
15                     maxn[i][j] = max(maxn[i][j - 1], arr[j]);
16                 }
17             }
18         }
19         vector<vector<int>> dp(n, vector<int>(n, INT_MAX));
20         for (int i = n - 1; i >= 0; i--)
21         {
22             for (int j = i; j < n; j++)
23             {
24                 if (j == i) dp[i][j] = arr[i];
25                 else if (j == i + 1) dp[i][j] = arr[i] * arr[j];
26                 else
27                 {
28                     dp[i][j] = min(dp[i][j], dp[i + 1][j] + arr[i] * maxn[i + 1][j]);
29                     dp[i][j] = min(dp[i][j], dp[i][j - 1] + arr[j] * maxn[i][j - 1]);
30                     for (int k = i + 1; k < j - 1; k++)
31                     {
32                         dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + maxn[i][k] * maxn[k + 1][j]);
33                     }
34                 }
35             }
36         }
37         return dp[0][n - 1];
38     }
39 }

转载于:https://www.cnblogs.com/wangyiming/p/11602984.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值