|
51 | 51 |
|
52 | 52 | <!-- 这里可写通用的实现逻辑 -->
|
53 | 53 |
|
54 |
| -### 方法1:暴力 |
| 54 | +**方法一:枚举** |
55 | 55 |
|
56 |
| -成本分为移动成本 + 收集成本 |
| 56 | +我们考虑枚举操作的次数,定义 $f[i][j]$ 表示类型为 $i$ 的巧克力进行了 $j$ 次操作后的最小成本。那么有: |
57 | 57 |
|
58 |
| -枚举最大移动次数`len`。 |
| 58 | +$$ |
| 59 | +f[i][j] = |
| 60 | +\begin{cases} |
| 61 | +nums[i] ,& j = 0 \\ |
| 62 | +\min(f[i][j - 1], nums[(i + j) \bmod n]) ,& j > 0 |
| 63 | +\end{cases} |
| 64 | +$$ |
59 | 65 |
|
60 |
| -若移动次数为`len`,移动成本`= len * x` |
| 66 | +接下来,我们枚举操作的次数 $j$,其中 $j \in [0,..n-1]$,那么进行 $j$ 次操作的最小成本为: |
61 | 67 |
|
62 |
| -对应下标为`i` 的巧克力,收集成本为`min[i][(i + len) % n]` ,其中`n` 为巧克力个数,`min[i][j]` 表示`nums[i-j]` 的最小值(可$$O(n^2)$$)预处理。 |
| 68 | +$$ |
| 69 | +\sum_{i=0}^{n-1} f[i][j] + j \times x |
| 70 | +$$ |
63 | 71 |
|
64 |
| -最终结果$$result = \sum_{i = 0}^{n - 1} min[i][(i + len)\mod n] + len * x$$ |
| 72 | +我们取所有操作次数中的最小值即可。 |
65 | 73 |
|
66 |
| - |
67 |
| - |
68 |
| -时间复杂度:$$O(n^2)$$ |
69 |
| - |
70 |
| -空间复杂度:$$O(n^2)$$ |
| 74 | +时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。其中 $n$ 是数组 $nums$ 的长度。 |
71 | 75 |
|
72 | 76 | <!-- tabs:start -->
|
73 | 77 |
|
|
76 | 80 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
77 | 81 |
|
78 | 82 | ```python
|
79 |
| - |
| 83 | +class Solution: |
| 84 | + def minCost(self, nums: List[int], x: int) -> int: |
| 85 | + n = len(nums) |
| 86 | + f = [[0] * n for _ in range(n)] |
| 87 | + for i, v in enumerate(nums): |
| 88 | + f[i][0] = v |
| 89 | + for j in range(1, n): |
| 90 | + f[i][j] = min(f[i][j - 1], nums[(i + j) % n]) |
| 91 | + ans = inf |
| 92 | + for j in range(n): |
| 93 | + cost = sum(f[i][j] for i in range(n)) + x * j |
| 94 | + ans = min(ans, cost) |
| 95 | + return ans |
80 | 96 | ```
|
81 | 97 |
|
82 | 98 | ### **Java**
|
|
87 | 103 | class Solution {
|
88 | 104 | public long minCost(int[] nums, int x) {
|
89 | 105 | int n = nums.length;
|
90 |
| - int[][] min = new int[n][n]; |
91 |
| - for (int i = 0; i < n; i++) { |
92 |
| - int w = 0x3f3f3f3f; |
93 |
| - for (int j = i; j < n; j++) { |
94 |
| - w = Math.min(w, nums[j]); |
95 |
| - min[i][j] = w; |
| 106 | + int[][] f = new int[n][n]; |
| 107 | + for (int i = 0; i < n; ++i) { |
| 108 | + f[i][0] = nums[i]; |
| 109 | + for (int j = 1; j < n; ++j) { |
| 110 | + f[i][j] = Math.min(f[i][j - 1], nums[(i + j) % n]); |
96 | 111 | }
|
97 | 112 | }
|
98 |
| - |
99 |
| - long res = Long.MAX_VALUE; |
100 |
| - for (int i = 0; i < n; i++) { |
101 |
| - long sum = 0; |
102 |
| - for (int j = 0; j < n; j++) { |
103 |
| - int l = j - i; |
104 |
| - if (l < 0) { |
105 |
| - sum += Math.min(min[0][j], min[n + l][n - 1]); |
106 |
| - } else { |
107 |
| - sum += min[l][j]; |
108 |
| - } |
| 113 | + long ans = 1L << 60; |
| 114 | + for (int j = 0; j < n; ++j) { |
| 115 | + long cost = 1L * j * x; |
| 116 | + for (int i = 0; i < n; ++i) { |
| 117 | + cost += f[i][j]; |
109 | 118 | }
|
110 |
| - res = Math.min(res, sum + x * 1L * i); |
| 119 | + ans = Math.min(ans, cost); |
111 | 120 | }
|
112 |
| - return res; |
| 121 | + return ans; |
113 | 122 | }
|
114 | 123 | }
|
115 | 124 | ```
|
116 | 125 |
|
117 | 126 | ### **C++**
|
118 | 127 |
|
119 | 128 | ```cpp
|
120 |
| - |
| 129 | +class Solution { |
| 130 | +public: |
| 131 | + long long minCost(vector<int>& nums, int x) { |
| 132 | + int n = nums.size(); |
| 133 | + int f[n][n]; |
| 134 | + for (int i = 0; i < n; ++i) { |
| 135 | + f[i][0] = nums[i]; |
| 136 | + for (int j = 1; j < n; ++j) { |
| 137 | + f[i][j] = min(f[i][j - 1], nums[(i + j) % n]); |
| 138 | + } |
| 139 | + } |
| 140 | + long long ans = 1LL << 60; |
| 141 | + for (int j = 0; j < n; ++j) { |
| 142 | + long long cost = 1LL * j * x; |
| 143 | + for (int i = 0; i < n; ++i) { |
| 144 | + cost += f[i][j]; |
| 145 | + } |
| 146 | + ans = min(ans, cost); |
| 147 | + } |
| 148 | + return ans; |
| 149 | + } |
| 150 | +}; |
121 | 151 | ```
|
122 | 152 |
|
123 | 153 | ### **Go**
|
124 | 154 |
|
125 | 155 | ```go
|
| 156 | +func minCost(nums []int, x int) int64 { |
| 157 | + n := len(nums) |
| 158 | + f := make([][]int, n) |
| 159 | + for i := range f { |
| 160 | + f[i] = make([]int, n) |
| 161 | + f[i][0] = nums[i] |
| 162 | + for j := 1; j < n; j++ { |
| 163 | + f[i][j] = min(f[i][j-1], nums[(i+j)%n]) |
| 164 | + } |
| 165 | + } |
| 166 | + ans := 1 << 60 |
| 167 | + for j := 0; j < n; j++ { |
| 168 | + cost := x * j |
| 169 | + for i := range nums { |
| 170 | + cost += f[i][j] |
| 171 | + } |
| 172 | + ans = min(ans, cost) |
| 173 | + } |
| 174 | + return int64(ans) |
| 175 | +} |
126 | 176 |
|
| 177 | +func min(a, b int) int { |
| 178 | + if a < b { |
| 179 | + return a |
| 180 | + } |
| 181 | + return b |
| 182 | +} |
127 | 183 | ```
|
128 | 184 |
|
129 | 185 | ### **...**
|
|
0 commit comments