本文最后更新于 2025年10月23日 晚上
                  
                
              
            
            
              
                
                3-1 
解:  采用动态规划算法。
定义子问题: 
 
构建动态规划数组: d p dp d p d p [ i ] dp[i] d p [ i ] n u m s [ i ] nums[i] n u m s [ i ] 
 
状态转移方程: n u m s [ i ] nums[i] n u m s [ i ] n u m s [ j ] nums[j] n u m s [ j ] j < i j < i j < i n u m s [ i ] > n u m s [ j ] nums[i] > nums[j] n u m s [ i ] > n u m s [ j ] n u m s [ i ] nums[i] n u m s [ i ] n u m s [ j ] nums[j] n u m s [ j ] d p [ i ] dp[i] d p [ i ] d p [ j ] + 1 dp[j] + 1 d p [ j ] + 1 
   
 
d p dp d p 
 
 
根据上述过程,算法的时间复杂度为O ( n 2 ) O(n^2) O ( n 2 ) 
代码 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include  <iostream>  #include  <vector>  using  namespace  std;class  Solution  {public :int  lengthOfLIS (vector<int >& nums)  int  n = nums.size ();if  (n == 0 ) return  0 ;vector<int > dp (n, 1 )  ;for  (int  i = 1 ; i < n; i++)for  (int  j = 0 ; j < i; j++)if  (nums[i] > nums[j])max (dp[i], dp[j] + 1 );int  res = 1 ;for  (int  i = 0 ; i < n; i++)max (res, dp[i]);return  res;int  main ()  int > nums = {1 ,3 ,6 ,7 ,9 ,4 ,10 ,5 ,6 };lengthOfLIS (nums) << endl;return  0 ;
运行结果 
3-3 
解:  采用动态规划算法。
定义子问题: j j j 
 
构建动态规划数组: c [ j ] c[j] c [ j ] 1 1 1 j j j e x t r a s [ i ] [ j ] extras[i][j] e x t r a s [ i ] [ j ] i i i j j j l c [ i ] [ j ] lc[i][j] l c [ i ] [ j ] i i i j j j 
 
状态转移方程: j j j i i i i i i j j j c [ j ] c[j] c [ j ] 
c [ j ] = min  1 ≤ i ≤ j { c [ i − 1 ] + l c [ i − 1 ] [ j − 1 ] } c[j] = \min_{1 \leq i \leq j} \{c[i - 1] + lc[i-1][j-1]\}
 c [ j ] = 1 ≤ i ≤ j min  { c [ i − 1 ] + l c [ i − 1 ] [ j − 1 ]} 
其中,c [ i − 1 ] c[i-1] c [ i − 1 ] i − 1 i-1 i − 1 l c [ i − 1 ] [ j − 1 ] lc[i-1][j-1] l c [ i − 1 ] [ j − 1 ] i i i j j j 
 
返回最终结果: c [ N ] c[N] c [ N ] N N N 
 
 
根据上述过程,建立extras和lc矩阵的时间复杂度为 O ( n 2 ) O(n^2) O ( n 2 ) O ( n 2 ) O(n^2) O ( n 2 ) c [ N ] c[N] c [ N ] O ( n M ) O(nM) O ( n M ) M M M O ( n ) O(n) O ( n ) 
代码 
定义类 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 #include  <iostream>  #include  <vector>  #include  <climits>  using  namespace  std;class  Solution  {public :int  prettyPrint (vector<int >& length, int  M)  int  N = length.size ();  int >> extras (N, vector <int >(N, 0 ));int >> lc (N, vector <int >(N, 0 ));vector<int > c (N + 1 , INT_MAX)  ;for  (int  i = 0 ; i < N; i++) {for  (int  j = i + 1 ; j < N; j++) {1 ] - length[j] - 1 ;  for  (int  i = 0 ; i < N; i++) {for  (int  j = i; j < N; j++) {if  (extras[i][j] < 0 ) {else  if  (j == N - 1 ) {0 ;  else  {0 ] = 0 ;  for  (int  j = 1 ; j <= N; j++) {for  (int  i = 1 ; i <= j; i++) {if  (c[i - 1 ] != INT_MAX && lc[i - 1 ][j - 1 ] != INT_MAX) {min (c[j], c[i - 1 ] + lc[i - 1 ][j - 1 ]);return  c[N];  
主函数 
1 2 3 4 5 6 7 int  main ()  int > lengths = {3 , 2 , 2 , 5 };  int  M = 6 ;  "Minimum cost: "  << sol.prettyPrint (lengths, M) << endl;return  0 ;
运行结果