Skip to content

Commit f662a87

Browse files
committed
feat: add solutions to lc problem: No.0651
No.0651.4 Keys Keyboard
1 parent ca66451 commit f662a87

File tree

6 files changed

+188
-2
lines changed

6 files changed

+188
-2
lines changed

solution/0600-0699/0651.4 Keys Keyboard/README.md

+73-1
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,94 @@ A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54+
**方法一:动态规划**
55+
56+
定义 $dp[i]$ 表示前 $i$ 个按键可以显示的最大个数。
57+
58+
我们可以发现,要显示最多的 `A`,要么一直按 `A`,要么以 `Ctrl-V` 结束。
59+
60+
- 一直按 `A` 的情况,满足 $dp[i] = i$。
61+
-`Ctrl-V` 结束的情况,我们枚举对应的 `Ctrl-A` 的位置 $j$,可以得到 $dp[i]=max(dp[i], dp[j-1] \times (i - j))$。
62+
63+
时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。
64+
5465
<!-- tabs:start -->
5566

5667
### **Python3**
5768

5869
<!-- 这里可写当前语言的特殊实现逻辑 -->
5970

6071
```python
61-
72+
class Solution:
73+
def maxA(self, n: int) -> int:
74+
dp = list(range(n + 1))
75+
for i in range(3, n + 1):
76+
for j in range(2, i - 1):
77+
dp[i] = max(dp[i], dp[j - 1] * (i - j))
78+
return dp[-1]
6279
```
6380

6481
### **Java**
6582

6683
<!-- 这里可写当前语言的特殊实现逻辑 -->
6784

6885
```java
86+
class Solution {
87+
public int maxA(int n) {
88+
int[] dp = new int[n + 1];
89+
for (int i = 0; i < n + 1; ++i) {
90+
dp[i] = i;
91+
}
92+
for (int i = 3; i < n + 1; ++i) {
93+
for (int j = 2; j < i - 1; ++j) {
94+
dp[i] = Math.max(dp[i], dp[j - 1] * (i - j));
95+
}
96+
}
97+
return dp[n];
98+
}
99+
}
100+
```
101+
102+
### **C++**
103+
104+
```cpp
105+
class Solution {
106+
public:
107+
int maxA(int n) {
108+
vector<int> dp(n + 1);
109+
iota(dp.begin(), dp.end(), 0);
110+
for (int i = 3; i < n + 1; ++i) {
111+
for (int j = 2; j < i - 1; ++j) {
112+
dp[i] = max(dp[i], dp[j - 1] * (i - j));
113+
}
114+
}
115+
return dp[n];
116+
}
117+
};
118+
```
69119
120+
### **Go**
121+
122+
```go
123+
func maxA(n int) int {
124+
dp := make([]int, n+1)
125+
for i := range dp {
126+
dp[i] = i
127+
}
128+
for i := 3; i < n+1; i++ {
129+
for j := 2; j < i-1; j++ {
130+
dp[i] = max(dp[i], dp[j-1]*(i-j))
131+
}
132+
}
133+
return dp[n]
134+
}
135+
136+
func max(a, b int) int {
137+
if a > b {
138+
return a
139+
}
140+
return b
141+
}
70142
```
71143

72144
### **...**

solution/0600-0699/0651.4 Keys Keyboard/README_EN.md

+62-1
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,74 @@ A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V
4848
### **Python3**
4949

5050
```python
51-
51+
class Solution:
52+
def maxA(self, n: int) -> int:
53+
dp = list(range(n + 1))
54+
for i in range(3, n + 1):
55+
for j in range(2, i - 1):
56+
dp[i] = max(dp[i], dp[j - 1] * (i - j))
57+
return dp[-1]
5258
```
5359

5460
### **Java**
5561

5662
```java
63+
class Solution {
64+
public int maxA(int n) {
65+
int[] dp = new int[n + 1];
66+
for (int i = 0; i < n + 1; ++i) {
67+
dp[i] = i;
68+
}
69+
for (int i = 3; i < n + 1; ++i) {
70+
for (int j = 2; j < i - 1; ++j) {
71+
dp[i] = Math.max(dp[i], dp[j - 1] * (i - j));
72+
}
73+
}
74+
return dp[n];
75+
}
76+
}
77+
```
78+
79+
### **C++**
80+
81+
```cpp
82+
class Solution {
83+
public:
84+
int maxA(int n) {
85+
vector<int> dp(n + 1);
86+
iota(dp.begin(), dp.end(), 0);
87+
for (int i = 3; i < n + 1; ++i) {
88+
for (int j = 2; j < i - 1; ++j) {
89+
dp[i] = max(dp[i], dp[j - 1] * (i - j));
90+
}
91+
}
92+
return dp[n];
93+
}
94+
};
95+
```
5796
97+
### **Go**
98+
99+
```go
100+
func maxA(n int) int {
101+
dp := make([]int, n+1)
102+
for i := range dp {
103+
dp[i] = i
104+
}
105+
for i := 3; i < n+1; i++ {
106+
for j := 2; j < i-1; j++ {
107+
dp[i] = max(dp[i], dp[j-1]*(i-j))
108+
}
109+
}
110+
return dp[n]
111+
}
112+
113+
func max(a, b int) int {
114+
if a > b {
115+
return a
116+
}
117+
return b
118+
}
58119
```
59120

60121
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution {
2+
public:
3+
int maxA(int n) {
4+
vector<int> dp(n + 1);
5+
iota(dp.begin(), dp.end(), 0);
6+
for (int i = 3; i < n + 1; ++i) {
7+
for (int j = 2; j < i - 1; ++j) {
8+
dp[i] = max(dp[i], dp[j - 1] * (i - j));
9+
}
10+
}
11+
return dp[n];
12+
}
13+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
func maxA(n int) int {
2+
dp := make([]int, n+1)
3+
for i := range dp {
4+
dp[i] = i
5+
}
6+
for i := 3; i < n+1; i++ {
7+
for j := 2; j < i-1; j++ {
8+
dp[i] = max(dp[i], dp[j-1]*(i-j))
9+
}
10+
}
11+
return dp[n]
12+
}
13+
14+
func max(a, b int) int {
15+
if a > b {
16+
return a
17+
}
18+
return b
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution {
2+
public int maxA(int n) {
3+
int[] dp = new int[n + 1];
4+
for (int i = 0; i < n + 1; ++i) {
5+
dp[i] = i;
6+
}
7+
for (int i = 3; i < n + 1; ++i) {
8+
for (int j = 2; j < i - 1; ++j) {
9+
dp[i] = Math.max(dp[i], dp[j - 1] * (i - j));
10+
}
11+
}
12+
return dp[n];
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class Solution:
2+
def maxA(self, n: int) -> int:
3+
dp = list(range(n + 1))
4+
for i in range(3, n + 1):
5+
for j in range(2, i - 1):
6+
dp[i] = max(dp[i], dp[j - 1] * (i - j))
7+
return dp[-1]

0 commit comments

Comments
 (0)