@@ -51,22 +51,94 @@ A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V
51
51
52
52
<!-- 这里可写通用的实现逻辑 -->
53
53
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
+
54
65
<!-- tabs:start -->
55
66
56
67
### ** Python3**
57
68
58
69
<!-- 这里可写当前语言的特殊实现逻辑 -->
59
70
60
71
``` 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 ]
62
79
```
63
80
64
81
### ** Java**
65
82
66
83
<!-- 这里可写当前语言的特殊实现逻辑 -->
67
84
68
85
``` 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
+ ```
69
119
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
+ }
70
142
```
71
143
72
144
### ** ...**
0 commit comments