---- ---- 2020년 1월 16일

# 알고리즘 || DP 인스턴스에 마음 재귀 최적화  # 

 


 

# * 115 leetcode

 

1, 폭력 재귀 (자바)

 

1 개  공용  클래스 솔루션 {
 2  공공  정적  INT numDistinct (String를, 문자열 t) {
 3          반환 DFS (S, T, 0, "" );
4      }
 5  
6  공중  정적  INT의 DFS (문자열의 문자열 t, 지능 지수, 문자열 CUR) {
 7      경우 (인덱스 == s.length ()) {
 8          복귀 cur.equals (t)? 1 : 0 ;
9      }
 10      리턴 DFS (S, t, 인덱스 + 1, + s.charAt (색인) CUR) + DFS (S, t, 인덱스 + 1 , CUR);
11  }
 12     공공  정적  무효 메인 (문자열 []에 args) {
 13          문자열 S = "rabbbbbbbbbbbbiiiiiiit" ;
14          문자열 t = "토끼" ;
15          에서 System.out.println (numDistinct (S, t));
16      }
 17 }

분명히 긴 문자열 시간 제한 (이 샘플 1437ms를 사용하는 경우).

2, 메모리 검색 ( 자바)

 

(1 개)  수입 java.util.HashMap에;
2 개  
 공용  클래스 솔루션 {
 4      정적  클래스 returnType이 {
 5          공공  INT의 인덱스;
6          공공 문자열 CUR;
7          공개 returnType이 ( INT 인덱스 문자열 CUR) {
 8               .CUR = CUR;
(9)               있는 .index = 인덱스;
10          }
 11      }
 12      정적 의 HashMap <returnType이 정수> =지도 새로운 HashMap의 <> ();
(13)     공용  정적  INT numDistinct (문자열의 문자열 t) {
 14              반환 DFS (S, t 0 ' " );
15          }
 16      공용  정적  INT의 DFS (문자열의 문자열 t, 지능 지수, 문자열 CUR) {
 17 일          경우 (인덱스 == s.length ()) {
 18              반환 cur.equals (t)? 1 : 0 ;
19          }
 20          returnType이 = YES 새로운 returnType이 (인덱스 + 1, + CUR s.charAt (지수));
21          returnType이 더 = 새로운 returnType이을 (인덱스 + 1 , CUR);
(22)         INT = YES map.containsKey (예)? (예) map.get : DFS (S, t, 인덱스 + 1, + CUR s.charAt (지수));
23          INT = NO map.containsKey (아니오)? 없다 map.get (NO) : DFS (S, t, 인덱스하지 + 1 , CUR);
24          map.put ( 새로운 returnType이 (인덱스 CUR) + YES NO);
25          리턴 YES + nO를;
26      }
 27      공공  정적  무효 메인 (문자열 []에 args) {
 28          문자열 S = "rabbbbbbbbbbbbiiiiiiit" ;
29                  문자열 t = "토끼" ;
30           startTime을 = System.currentTimeMillis는 (); 
31이다          에서 System.out.println (numDistinct (S, T))
 32           endTime- 사용자 = System.currentTimeMillis는 () 
 33 인          ( "프로그램 실행 시간 :"+ (endTime- 사용자 - startTime을) + "MS"에서 System.out.println );
 34      }
 35 }

 

아마 위치는 폭력이 더 이상 재귀 사용할 때보 다 실제로 (같은 재귀 생각하는 모습을 다른 사람이 동일하지 않습니다),하지하지 않습니다, 그리고 특정 연구 후, 짧은에 여전히 응답. (밀리 죠)

 

3 개의 차원 동적 프로그래밍 (자바)

마지막으로 자신의 문제가 거짓말 실현 (나쁜 상태, 인덱스의 순서를 curString하는 차원을하고 모든 경우의 열거 할), 내가 함께, 각각 다른 사람에게 전환의 생각, 그래서 재귀, j는 s의 일치를, t을 나타냅니다 현재 위치.

연역 전사 식 DP 용이하다 [I] [J] = s.charAt (I) == t.charAt (j)? DP [I-1] [J-1] + (DP) [I-1] [J] : DP [I-1] [J]

1 개  공용  정적  INT (문자열의 문자열 t) numDistinct {
 2          INT [] [] DP = 새로운  INT [s.length () + 1] [t.length () + 1 ];
3               ( INT I = 0; I는 <= s.length (); I ++) DP [I] [0] = 1 ;
4               ( INT 나 = 1; I <= s.length ()는, I ++ ) {
 5                   ( INT J = 1; J <= t.length (); J ++ ) {
 6                      DP가 [I] [J] = S .charAt (I-1) == t.charAt (j-1)? DP [I-1] [J-1] + (DP) [I-1] [J] : DP [I-1 ] [J];
7                  }
 8              }
9              복귀 DP [s.length ()] [t.length ()];
10       }

이 1ms과 동일한 샘플 시간, 효율성이 크게 개선되었다.

4 일차원 동적 프로그래밍 (자바)

공간의 관점에서 최적화를 계속합니다.

1 개  공용  정적  INT (문자열의 문자열 t) numDistinct {
 2          INT m = s.length (), N = t.length ();
3          INT의 DP는 [] = 새로운  지능 [N + 1 ];
4          INT의 사전 = 0 , TMP;
5           ( INT I = 0; I는 <= m; I ++ )
 6               ( INT J = 0; J <= N; J ++ )
 7              {
 8                  TMP = DP [J]
9                  경우 (j == 0) DP [J] = 1 ;
10                  다른  경우(I == 0) DP [J]를 = 0 ;
(11)                  그 밖의  경우 (s.charAt (I-1) == t.charAt (j-1)) DP [J] + = 사전;
12                  미리 = TMP;
13              }
 14          리턴 DP [N];
15       }

# 편집 : 2020년 1월 15일 

추천

출처www.cnblogs.com/zzl1209/p/12203729.html