2
2
* @Author: Chacha
3
3
* @Date: 2022-04-16 23:18:10
4
4
* @Last Modified by: Chacha
5
- * @Last Modified time: 2022-04-17 00:00:28
5
+ * @Last Modified time: 2022-04-17 23:05:41
6
6
*/
7
7
8
8
/* *
37
37
38
38
#include < iostream>
39
39
#include < vector>
40
+ #include < string.h>
40
41
41
42
using namespace std ;
42
43
@@ -45,7 +46,11 @@ class Solution
45
46
private:
46
47
/* data */
47
48
public:
49
+ int dp[1005 ][2 ];
50
+
48
51
int wiggleMaxLength (vector<int > &nums);
52
+
53
+ int wiggleMaxLength1 (vector<int > &nums);
49
54
};
50
55
51
56
/* *
@@ -90,14 +95,63 @@ int Solution::wiggleMaxLength(vector<int> &nums)
90
95
return result;
91
96
};
92
97
98
+ /* *
99
+ * 动态规划
100
+ *
101
+ * 很容易发现,对于我们当前考虑的这个数,要么是作为山峰(即nums[i] > nums[i-1]),要么是作为山谷(即nums[i] < nums[i - 1])。
102
+ * 1. 设dp状态dp[i][0],表示考虑前i个数,第i个数作为山峰的摆动子序列的最长长度
103
+ * 2. 设dp状态dp[i][2],表示考虑前i个数,第i个数作为山谷的摆动子序列的最长长度
104
+ *
105
+ * 则转移方程为:
106
+ * 1. dp[i][0] = max(dp[i][0], dp[j][1] + 1),其中 0 < j < i 且 nums[j] < nums[i],表示将nums[i]接到前面某个山谷后面,作为山峰。
107
+ * 2. dp[i][1] = max(dp[i][1], dp[j][0] + 1),其中 0 < j < i 且 nums[j] > nums[i],表示将nums[i]接到前面某个山峰后面,作为山谷。
108
+ *
109
+ * 初始状态:
110
+ * 由于一个数可以接到前面的某个数后面,也可以以自身为子序列的起点,所以初始状态为:dp[0][0] = dp[0][1] = 1。
111
+ *
112
+ */
113
+ int Solution::wiggleMaxLength1 (vector<int > &nums)
114
+ {
115
+ // void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
116
+ memset (dp, 0 , sizeof dp);
117
+
118
+ dp[0 ][0 ] = dp[0 ][1 ] = 1 ;
119
+
120
+ for (int i = 1 ; i < nums.size (); i++)
121
+ {
122
+ dp[i][0 ] = dp[i][1 ] = 1 ;
123
+
124
+ for (int j = 0 ; j < i; j++)
125
+ {
126
+ if (nums[j] > nums[i])
127
+ {
128
+ dp[i][1 ] = max (dp[i][1 ], dp[j][0 ] + 1 );
129
+ }
130
+ }
131
+
132
+ for (int j = 0 ; j < i; j++)
133
+ {
134
+ if (nums[j] < nums[i])
135
+ {
136
+ dp[i][0 ] = max (dp[i][0 ], dp[j][1 ] + 1 );
137
+ }
138
+ }
139
+ }
140
+
141
+ return max (dp[nums.size () - 1 ][0 ], dp[nums.size () - 1 ][1 ]);
142
+ };
143
+
93
144
int main (int argc, char const *argv[])
94
145
{
95
146
Solution s;
96
147
vector<int > nums = {1 , 7 , 4 , 9 , 2 , 5 };
97
148
vector<int > nums1 = {1 , 17 , 5 , 10 , 13 , 15 , 10 , 5 , 16 , 8 };
98
149
99
- cout << " [1, 7, 4, 9, 2, 5]:" << s.wiggleMaxLength (nums) << endl;
100
- cout << " [1, 17, 5, 10, 13, 15, 10, 5, 16, 8]:" << s.wiggleMaxLength (nums1) << endl;
150
+ cout << " wiggleMaxLength [1, 7, 4, 9, 2, 5]:" << s.wiggleMaxLength (nums) << endl;
151
+ cout << " wiggleMaxLength [1, 17, 5, 10, 13, 15, 10, 5, 16, 8]:" << s.wiggleMaxLength (nums1) << endl;
152
+
153
+ cout << " \n wiggleMaxLength1 [1, 7, 4, 9, 2, 5]:" << s.wiggleMaxLength1 (nums) << endl;
154
+ cout << " wiggleMaxLength1 [1, 17, 5, 10, 13, 15, 10, 5, 16, 8]:" << s.wiggleMaxLength1 (nums1) << endl;
101
155
102
156
return 0 ;
103
157
}
0 commit comments