登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 增量元素之间的最大差值】
$ y0 |2 e0 r0 i4 Z! V; g/ V2 Q# F) O* J5 O: d+ x$ a: k% w$ b5 r
解题思路/ ^9 b& ]1 r0 w! ^
遍历数组维护全局最小值,若当前值较大就是一个合理的答案,遍历过程取最大的合理答案即可。. C+ [% R) E# ^5 ?2 `1 o5 T0 ]
- [0 M {8 ~& s! P9 C; R$ ^, t代码展示
& {) G2 \, b9 U4 Z. ]+ Y
( [+ X" N' r. {/ s7 Y1 A/ }public class Solution {
+ H7 n5 _% U7 ], m public int maximumDifference(int[] nums) {
7 z# w9 x* h0 n' `9 {. N1 E if (nums == null || nums.length == 0) {) H0 v. d- f; M3 O4 Z
return 0;3 R, b, n* [; g
}; Z) t) M6 N: Y* B( N1 J% a
int res = -1;7 N1 c) M0 Q3 f8 l+ j7 k- c/ {
int minNum = Integer.MAX_VALUE;0 c2 t" L8 I$ {
for (int n : nums) {
5 E! L0 z# F" }! ]& a5 \! Q if (n > minNum) {0 c0 b. n% p9 [- x( G* v5 V
res = Math.max(n - minNum, res);
$ T& I+ q5 `! \! b. g' k' ~ }' b1 p7 _- l- `4 X( G k
minNum = Math.min(minNum, n);
" z# \6 p+ w: f) c- S0 Q }
$ ]% `% ?- h' e return res;
& n& E- F# n+ G0 M. v3 J f }3 K- l+ f8 j, C) J. E# [
}
2 a5 z& B9 s% K6 l( d7 |
$ e2 D7 x7 u2 z
8 y# u: A2 \' A9 C# \9 A2 X5 O# f【 NO.2 网格游戏】
: ^" E% |, D3 n7 ]! d
, v/ ^! `$ R6 |( n3 M* e解题思路
2 V4 M! ]& B/ G- [6 s. m注意到网格只有两行,所以第一个机器人需要选择的实际上就是从哪一列向下。在它确定了向下的那一列之后,第二个机器人要么只能拿到第一行开始部分的分数,要么只能拿到第一行结尾部分的分数。
% q# _4 M; \9 T! }4 m8 p% ^3 c4 ~& a6 I1 ^( \
代码展示4 F# F( |- g1 D5 t- n5 {0 e7 G
: i; N, A; _2 ^
public class Solution {6 g6 Y7 l) ?' t$ P9 T7 i2 L: {
public long gridGame(int[][] grid) {7 t) e- n; M9 n) q5 h6 e2 H
if (grid == null || grid.length == 0 || grid[0].length == 0) {' Z- U0 _; R6 L8 b, V
return 0;
: C4 d4 `1 N4 |/ K* Y. M/ \ }$ h1 K' u- Z- V5 ~
int n = grid[0].length;
2 h/ E' x) H) y' Y( f. Z& a long left = 0, rihgt = 0;
+ O' \& I$ q- m; {. v for (int i = 1; i < n; i++) {# Z* w* \& L- x+ C2 D- R h% G
rihgt += grid[0][i];
8 j( i1 B0 `; t0 _+ I }
G& v' p3 ^6 O4 G. I, V6 Z% o long res = rihgt;: A0 u( f, p7 U3 J8 J, w
for (int i = 1; i < n; i++) {
4 |$ `6 o9 i$ F7 u; @ left += grid[1][i - 1];8 h2 a) a# ?! Q$ I) h% u( V1 P
rihgt -= grid[0][i];, r* e# @) v' k) S& U$ Q, `
res = Math.min(res, Math.max(left, rihgt));+ [) m7 c' W8 ?9 j& H: t3 y- I+ Q1 X
}
% t0 {0 |0 Z4 N {& F return res;
' Z/ ?4 z/ o2 u' | }
: k, ?. \1 N6 B( J ?6 s8 H- a}5 O8 Q1 @, k# Y B1 s, v5 e( s" W
/ z' J" T- b2 I( j; ^
- H' r7 k- H3 r% L$ `) b3 D【 NO.3 判断单词是否能放入填字游戏内】
# [' q2 e. `5 c. _' E6 U! D3 q q% P }- R. d: ~3 G3 y
解题思路
; M- Z( ^2 h- a! N0 f模拟题,详情见注释。3 N K% G0 M! i% y
C: k% x6 |% |) g6 e N: F3 g代码展示9 ^2 Q) e* v: I8 A
5 Z5 r* j) V1 tpublic class Solution {) a( _+ }/ |% u3 _ x' v
( R8 J) k8 p7 j1 j6 l; L7 i, e) A
public boolean placeWordInCrossword(char[][] board, String word) {
6 `, E2 ^9 W2 S% v& K' s7 f
! J2 X+ o! t7 ?, z) g if (board == null || board.length == 0 || board[0].length == 0) {
8 \3 Y6 t9 I. w2 A E% Z0 C( B, } p' p4 ~6 r' k2 l9 F
return false;+ R7 ~! e2 ^. E& `/ ^1 t0 E
, R* H! M- B4 y. k4 G4 |
}
* \8 v5 a# v+ @7 r1 Y. }* N$ ^) i8 ~& i+ y% R
int n = board.length;$ e+ o9 Q. _' P/ h# f" W7 @6 O# S
" Z" n; H) M3 @6 ^$ Y6 ~
int m = board[0].length;5 Q3 C1 M3 i1 @7 M
# n: B2 l" Y2 B5 \* r, U for (int i = 0; i < n; i++) {
9 z, U, v7 s( M3 [: {9 S/ k2 s2 W6 H8 J7 W
for (int j = 0; j < m; j++) {4 e8 F1 G! ?; a6 N; Y0 s! O
, Y7 [4 Z: O3 y8 n4 ~+ G
// 从 (i, j) 开始,尝试水平地、垂直地放置单词
# A' X* f4 {9 E9 y. A/ r
* g6 K) }: T; F/ @ x3 b' f3 R3 v# q if (isValid(board, word, j, j + word.length() - 1, i, true) || isValid(board, word, i, i + word.length() - 1, j, false)) {3 `1 {- H1 R5 Z$ a8 N: u+ [
" w7 I1 G8 @5 G) N& ]/ B
return true;
4 w! x, b/ ?+ l1 X
. A6 R- R3 @7 g5 B. w9 y/ _9 e }; S: j# U: A9 B% x9 ^
9 k9 Y ]# f( }, G3 \ }
; L5 t+ M$ _! ?8 B/ H0 ^) ~6 \( Y7 n$ V8 m; m& V- ?+ t/ i w
} }' q* |- P+ K% O
3 c7 c" M1 _( Q; ~: I( a return false;: F/ p$ P" x6 c7 T" W7 i
8 u) r- P2 U \, O }
/ t* L6 V( u1 |" i2 q0 m3 `( V: N% V0 S0 x8 Y7 @
private boolean isValid(char[][] board, String word, int start, int end, int standard, boolean isHorizontal) {
) q5 r6 ^) w( U9 x4 z% h5 C/ {8 N2 M2 J4 |* Q6 A
// 水平放置, standard代表行, 固定不动
* \" U3 [; ?: Y5 \' g% |" }$ E* r H( V6 ]
if (isHorizontal) {
1 v& {+ V; _# R; \/ x8 L( o# J4 ~1 \* y. E% J
if (end > board[0].length - 1) {, }# A& B) i9 F- v9 h# Z$ [* A
' ]3 ]$ J2 `" K; T$ U8 T: T6 l
return false;5 Z1 j% V( O0 w! A' X: j/ X
' E5 q G4 P, R9 H( c$ b
}& r8 h. s& ]* Y% u
& X% e7 `% {1 {- b // 如果左边界不越界,检查左边界的元素是否合法
& e* x. B. K. C. P( V0 U, o9 X
& H$ q4 g' O' |. U9 _5 d if (start - 1 >= 0 && (board[standard][start - 1] == ' ' || Character.isLetter(board[standard][start - 1]))) {; |, ^% y4 W. a. ]
5 i1 R' j/ ~2 m- \7 c% q9 R8 W) Z return false;
* t* z H A! B& {
" O! i. z3 `* r. w" V4 o3 j: B }
$ Z% q( V" `# X0 z0 l, ?
) O! x7 B3 E$ A/ z, r* n; U/ v/ p // 如果右边界不越界,检查右边界的元素是否合法" s# y6 I, \: Z/ ~( b6 n; R
+ Y6 _! `4 ^! B" k$ A& X if (end + 1 < board[0].length && (board[standard][end + 1] == ' ' || Character.isLetter(board[standard][end + 1]))) {* o$ [0 {& c) M) }5 w7 ~4 z( X
" l7 w: Y0 G/ b7 l" ?
return false;7 c0 I" R3 u; w: [8 a' e8 t
2 q% M/ T: n2 E# h' Q1 I v' }
}
' W8 g( S: [( J
$ g' _" G0 _! y8 |6 d" v6 o; d8 o // 至此,它的位置已确认是合法的了4 i' S1 Z$ ~6 q/ A9 e# C" Q
# O" {4 B* b# p8 z. X& I
// 接下来,只需要判断 (standard, start) ~ (standard, end) 这个区间 "是否有障碍'#'0 J& O+ Z& y% }" m7 r
; T$ d- ^. c; K // 正反都需要判断
4 K: [* z) A$ A0 G! g2 F
& ]1 Q; t: h' F( W0 Z return check(board, word, start, end, standard, true, false) || check(board, word, start, end, standard, true, true);/ U5 S( |( J* |" d5 Q; J
3 |& H0 o$ b2 p3 ?. r5 M$ n4 d
}; D7 `) @4 x; v
1 g* k" a" ~3 l& Q // 垂直放置,standard 代表列, 固定) T9 h' y: G& |
2 h9 Q% d5 m. ?8 |9 _) T else {) U1 H! {8 N M) b
1 `& y0 g/ K# t) ~ V9 ]; D' X if (end > board.length - 1) {9 T" q C3 x! K% ?: f
( U* X, i U: E5 I9 G5 h
return false;! J8 R8 O1 P* O0 q, u
* l; x# [& X E; H0 r6 R: Z }3 z: F' Z1 k- ?& M( _
8 z; f$ _' n) F% |1 k) \7 `( r // 如果上边界不越界,检查上边界的元素是否合法1 S. e' L+ `+ V' I r
: `) K) ^+ b- O( s$ P if (start - 1 >= 0 && (board[start - 1][standard] == ' ' || Character.isLetter(board[start - 1][standard]))) {
# ?- C! V# D" G% q: g% I5 M6 d7 g: y
8 D( h/ S7 u& p. M return false;! i$ P1 j) z! ~ ]) H% P
; M; w$ M4 w; Z5 j3 I
}' G5 B) f, ~+ V9 A7 `+ p
6 h% @3 E# J: o4 T& j0 Z. z
// 如果下边界不越界,检查下边界的元素是否合法
5 o* V. L, T. H" f7 s$ b% r) ?4 W2 O, k$ M
if (end + 1 < board.length && (board[end + 1][standard] == ' ' || Character.isLetter(board[end + 1][standard]))) {
5 ^. e$ M. t6 `4 J8 R0 V9 u' P& n! z8 o- f5 v
return false;
) \$ F8 G) @. V& Y3 k
' h8 f& E# q' c8 G/ G6 s4 k }
* N3 X$ [3 x4 x# p
6 A: @1 E8 o, o6 P7 R+ a // 至此,它的位置已确认是合法的了0 c% ]. }3 g% X, G$ {
- U0 G! X; t' d4 w5 S/ X$ O
// 接下来,只需要判断 (start, standard) ~ (end, standard) 这个区间 "是否有障碍'#'0 _5 r# f7 f- G& g8 D
" N! M# R2 x/ m ~9 `! R // 正反都要判断
4 p9 t9 y) Y1 G& ~" u
* @" a# ~! L- [* X) i6 M return check(board, word, start, end, standard, false, false) || check(board, word, start, end, standard, false, true);
. K$ z7 \9 i" F- u" n/ ~0 _. p2 m! ] U1 s( {4 g5 d
}0 c& b$ [4 J2 @2 H# H4 Q' \, k
+ k) ? [: y0 _# W( ?: g }
. P5 @( B+ \/ ?3 P" s" ^( n+ z! h! q& Q: f5 ^ b5 L# D
private boolean check(char[][] board, String word, int start, int end, int standard, boolean isHorizontal, boolean isReversed) {
% ~8 G* g/ r5 d1 j f8 s: f
- N* \" J1 E0 t: A, ]# t if (isHorizontal) {
0 H8 v6 P- i$ \; `3 F; O3 o, v. e& R+ j0 T% H6 j! u$ b7 t* D
// 正向模拟
: P, R- l5 ~3 [( V/ P# G% m2 p( n* N3 w% @
if (!isReversed) {
0 _7 U. s5 u. [: ]3 c+ v+ Z! t7 h2 u0 k' h8 ^3 ^0 W/ u) Q- t
for (int i = start; i <= end; i++) {
5 j+ M6 B0 M7 x7 x+ I
( j; @6 c+ H' T/ Q# I2 I if (board[standard][i] == '#' || (Character.isLetter(board[standard][i]) && board[standard][i] != word.charAt(i - start))) {
$ V/ e) d6 L% [! E- |* N# }' B6 _- S7 P
return false;
+ [4 ?, f/ _6 _, [! x4 b7 q' l/ Y" K" a$ I. G
}6 U M! P Z( y! X
7 d7 `& L. S( j) g, u, n }
" S# h' p7 Q8 Y. y- q' m# Y; q7 j' g. X c) p/ ?0 T+ Z
}
3 S0 g2 o1 \) F: l1 l5 D. l! J! ~" V& J5 B5 h
// 反向模拟) Y" B o8 @9 V' U" S y8 B
6 u' V; \" V+ R& L else {# `% H" e ?" J6 }8 [; A) R
" E. I4 K+ k3 |- j, p: K0 K
for (int i = end; i >= start; i--) {; K3 Q3 k% T5 l4 ?; r3 o
" y" N9 _7 [; X5 [3 }) V+ x
if (board[standard][i] == '#' || (Character.isLetter(board[standard][i]) && board[standard][i] != word.charAt(end - i))) {6 n4 R) Q. q5 ]8 C$ m# @+ H
& v2 m3 y5 X% k o/ U' X! m return false;3 d; }, @5 W _8 [0 _3 w
& ?5 ]% q* F; O: V }
{4 M- |3 v0 k! ~# ~4 [+ k9 C
) D H2 K0 j8 [8 r9 B0 J }
V/ K' {, {- C- Y' ~5 Z. p z
# D6 Y/ F! i0 {1 x1 ^% o! ? }1 {3 q4 S4 F) K+ z" ~, ^0 C+ e/ S
3 y" G# R* x O( {
}3 @9 x& ~: D. ^
$ V6 o2 H( o# S+ N8 o6 g
else {( O1 W7 |7 N- U) d9 b$ b
' n* U5 R9 m) W$ w // 正向模拟4 {, ~; H! } z; L" n7 `6 X7 v( A3 `4 \
o" B$ F. U0 Y; [; W$ b if (!isReversed) {
/ \% y) r2 k! B$ |6 p/ F" g6 w. X% a: L! F3 G5 y4 w& g1 |
for (int i = start; i <= end; i++) {2 _% r! l+ D1 h8 _+ @( I
7 a* r& Z) K6 d v3 b! G2 t
if (board[i][standard] == '#' || (Character.isLetter(board[i][standard]) && board[i][standard] != word.charAt(i - start))) {
3 t) B7 J: |8 N' P! n; v9 {# i7 v% A
return false;# o3 I. K- S! O& {2 D5 `
- T& B* o( l0 ?7 V c+ Y; ?) V4 o. a
}
4 {% \' k" R+ M8 h @# \8 o, j1 ]0 E' A% r7 T4 r7 p1 c1 v" c5 K
}
4 {9 [( p3 {4 S- n% F: X0 V W" o# v4 i: E J7 O5 l. P* f5 @2 I
}
9 p. q( E0 K* X9 M# i, q
' j5 C* j' ~# y! T* |- b // 反向模拟2 s5 P1 T e1 Y( H7 Z4 `# B6 W: \
% r8 a& j& ^, m6 w6 H
else {
- b3 d2 Y9 C) ~8 N5 ?+ V; k
. `0 p2 z4 ]8 G) R# F- r; v for (int i = end; i >= start; i--) {
% g" L& Y1 l9 T6 u" D0 Y W. e4 z9 P0 J
if (board[i][standard] == '#' || (Character.isLetter(board[i][standard]) && board[i][standard] != word.charAt(end - i))) {& V4 N i0 a/ ?4 d
4 l& E( |+ ~4 g* M O return false;1 O6 \$ h5 K1 s& G
, Z! Q- y4 q3 R. R
}
2 O. @1 ~# M2 V) k) U8 i6 O- ^( F5 [4 c6 g+ X# ?& H5 p
}
3 f. D2 ?. j. i( ]! N, C. \. @ s* @: F, @
}1 I. ?. t, T/ [% q; `+ j
! ?$ b# l) Z4 h3 _ }
9 t6 B4 L+ P* h6 l. h0 p* Q2 z. B! K3 D1 j9 j0 U" p, x0 J
return true;" Q' q" ~2 x" v1 ?: x( x
3 j; f/ E0 f7 {" @. w, Q }* l" }# B* |) R) h
9 K$ p; }( p! s" v9 L: p
}
+ y$ v$ U' P5 B' u/ S0 N0 x3 V2 R* E9 ~* V, p" y+ t
# ~* ^- A. ^1 D& t/ c
【 NO.4 解出数学表达式的学生分数】* F2 e" s* z3 {6 \: z
8 t% n) ?2 S5 Y7 W r' Z# p3 t
解题思路
1 I M/ n; P2 j9 Q; J
6 l7 I! \2 ]; m" F" t首先理一理总体的思路,我们需要做的事情有:
# b* j6 p2 B* o$ B+ e& }
! C% L! \& o+ w6 C+ z) d2 b
" o8 y8 E7 T% g: Z+ Z6 C1. 求出表达式的正确值:Stack的方式解决! I# D% H' q; n+ y" B
2. 求出表达式所有可能的值:区间型动态规划解决
- N' K5 W" E, ~! O0 h! n3. 计算学生的得分:计分即可- {3 l: ~' P( L: K; S. o2 n# K
代码展示
1 t. n+ Z( N" H5 F% |/ k& W+ E* R( n0 Z% n! D4 e+ M
public int scoreOfStudents(String s, int[] answers) {
, e% W; h# o& U# @1 d; h2 H1 V, C/ b! O' a7 N% @, I
int[] count = new int[1024];" o: l1 u! \. C
% T& Z. m+ o/ n9 t# L for (int ans : answers) {% X2 |0 J/ O. L" Z: _. A* D7 M
6 a' m% ]; c5 S! |# d" ^
count[ans]++;6 k3 v( d% ?. V* Q
& d% D3 t! t; g! B" ?# W
}' O* F$ e) w2 `7 {
4 T$ O' C7 A* `0 p2 c f# e! c* W) E
Stack<Integer> stack = new Stack<>();/ l/ H* H) `! Z1 I( ^2 ~* W9 s3 _
1 Y: D+ m& w- [1 `+ X! n4 Q
stack.push(s.charAt(0) - '0');
, T% O4 P/ U9 P9 v0 w8 T
; j7 K1 |2 w6 z) B) k8 N5 _: v7 u) ^- m for (int i = 1; i < s.length(); i += 2) {/ ], A: p9 f( B; }: v4 e( k
/ P1 }; i! S( ` // 加法暂时不做,存在栈顶! ]: ~7 n F( Q2 {
9 v$ t. t$ X9 E. }
if (s.charAt(i) == '+') {
& l% d4 W3 L( [# J& s3 B5 G; \. {/ k- Q2 o) N7 c5 p
stack.push(s.charAt(i + 1) - '0');* H* P! F: F5 ^+ X8 z9 _9 ^6 A. y
9 |8 D- W% G: [+ H9 _
} J8 p; D% _2 g9 E. ^% g# [0 d
3 e3 X( A% y V. B2 Q0 \
// 乘法直接运算. X! Y' M+ [3 g5 n2 Z
! m' d& J% K6 ?6 i; o
else {
\! `( q$ J5 C& |( Y4 w
4 ]5 p# h+ b1 M2 B stack.push(stack.pop() * (s.charAt(i + 1) - '0'));; H6 l' e0 P8 H' ~: c. I( u7 G6 `
3 h' N6 U9 G8 x# r* [" k q }1 N% v: W" C5 b8 I V* T. k. q
, J' W% O3 i" m2 G, `
}
! e2 E& R% A4 u- w
: G* n; q; W9 ^' e0 m0 D x int rihgtAns = 0;
6 B' z8 E6 F* e& q$ E- _* L
7 A+ z/ V: ~: e3 Z+ x# W8 A! Q while (stack.size() > 0) {
. L( v# O) }4 i" r0 l, k
. v, D6 N# D" h rihgtAns += stack.pop();
+ m @; ~" [& L p) ^0 E" n v+ d4 @7 N
}7 {) L. o+ n1 }/ @, @# u% p O
8 s/ c3 G" X/ u# T3 j$ l
// 计算正确的人数积分
8 A1 L/ M7 B0 ]9 ?; i1 |
2 {: N9 {9 X; A$ Y T int res = count[rihgtAns] * 5;
: f9 O6 l# b! a1 u4 c( {! o
R- [% j7 R( v- S
5 M( }* E# _3 C4 v- b+ ^. v# [+ O9 D
// 枚举所有可能的计算结果
) f0 v/ y) N* j$ t$ S; K
- \2 B4 m/ b: d: M" y }0 j int n = s.length();# h- i3 t/ a1 G) ]! ? H
7 e' `+ W, Q Q: }" H Set<Integer>[][] dp = new Set[n + 2][n + 2];, v% H' `9 u5 \
" W6 O: W' P7 \; Q& l+ l for (int i = 0; i < n + 2; i++) {, g4 u% H6 H {" R. d6 V+ w
9 _# ]8 N, K& B( t for (int j = 0; j < n + 2; j++) {& e6 g5 z n. k
0 A. l( m1 c8 T7 l: G dp[i][j] = new HashSet<>();
4 @) P/ B6 ?1 z# @, n1 l( f! o+ X7 m+ R/ F' G
}
' j6 R9 ^$ A2 e; k% q+ ~9 b
5 E) f6 R- P5 _: F& M }
$ l1 b8 Q, p! J5 B' N! z2 R Y2 z) {2 b" {8 Q; n5 [) v7 Z
for (int j = 0; j < n; j += 2) {
5 r9 g1 O9 J2 J& S6 U4 Q
" \ [. t. [9 X5 x dp[j][j].add(s.charAt(j) - '0');
4 A! Y. o t% |; D# \5 t+ F
) b, |5 C( z7 n; I! N) g }
- H: v! \; G' d# o% u
- |3 U, p7 Z% h" P8 u* \$ o+ Q // 区间型动态规划
" d9 i7 U4 s. g/ K, Y
# m) w' k( Z& A5 L for (int len = 2; len < n; len++) {) ?- Z. Q% a- w, g+ z
% }7 y$ v. b; B, g // 左端点 i0 p7 m; [4 v9 o" U& l; k+ E' P
1 R T, j$ {- y. ` B for (int i = 0; i + len < n; i += 2) {4 w7 S9 `6 O& V
$ M0 M/ `2 h! r* O" H+ L // 枚举左半部分的长度
7 {2 U' o5 L# j" u; ?8 G3 x# c# |/ v6 g* e
for (int leftLen = 0; leftLen < len; leftLen += 2) {( A( M% q& r; t3 p8 w
( H, |! h, T) X C& J. I
// left 表示左半部分的值& a1 ] \* F# a: y; z& W9 m
7 v) i) t# |; ~2 P9 ?" ~ // right 表示右半部分的值& ?8 b$ D2 ^% O% y: ?$ ?4 r
9 ?. K; w' U) Q- n1 S2 ~
for (int left : dp[i][i + leftLen]) {
# A3 X! ~! `: d/ z, M! @
" u9 x9 C% I2 [& @2 s* i+ S for (int right : dp[i + leftLen + 2][i + len]) {* g' K% w# \( g
) k% U) q* }/ L% `5 g5 C& d/ n3 f
if (s.charAt(i + leftLen + 1) == '+') {8 ?2 [8 _- ~& w! c! X' r+ i
1 G `- l3 V- Q6 H5 V G5 G if (left + right <= 1000) {% y$ w; a5 L" j% W! I3 I
' T0 t/ ~! z' s( X' g& s y dp[i][i + len].add(left + right);+ n$ I W' s- I# t6 }6 _+ O
, ?8 X% f2 P- R* y4 o9 O2 [ }
- q, e, u2 x0 |6 k9 {+ m O9 @' z) B( j9 B' V5 [, P |! X& I
} else {
- l7 Q" [) K: R0 p% s
- R5 f3 l* Q4 ?0 |4 T if (left * right <= 1000) {/ M+ n3 f6 K+ P8 {
" m' M1 q) H& c& I* x' t. c" u' _
dp[i][i + len].add(left * right);
% [1 C' e( C+ [2 F, C# C P. ~$ @% o9 h+ m) @3 q+ T# a
}
; m+ u& B- Z! @; @) N6 E" W0 T O* |+ m
}
2 b/ N0 ]- p z0 @# L7 d# j" Q- o: k8 h
}: f* Y9 E2 p# A- ?0 f/ l
7 g( P! r# k. r, ? N1 n ? }" ]/ n, c1 F5 F* y
4 Y3 ~8 W* p2 c/ ` }
& N2 y8 N$ q+ W! E( ], `8 b. v' f0 S3 R* e1 [" e
}
2 l9 g) U2 z0 {* |6 s" i0 S; ^4 k0 j/ ~5 o9 U' A. A8 {# K9 l! w
}
$ C# H4 S8 s: L
, E6 \2 O9 S5 |
x) _+ H! V" e, ~$ m' k1 [( a4 j3 a* ?. t6 x. q0 u& o
for (int points : dp[0][n - 1]) {5 S, D, }9 c9 X
+ V+ d: x* q8 K N/ a$ O
if (points != rihgtAns) {$ I1 t: x! D3 U) S6 V8 W- n7 s
& C( S! H+ X3 [6 d. f% ]6 I res += 2 * count[points];
7 g$ Q- V* G7 l
1 o2 u1 R9 v+ Q, ? }
' @4 Y- Y0 _9 e: u% F8 h& k+ ?, p5 f* J7 x0 i7 X1 I) ~
}+ j" n9 b, |$ A7 U$ c7 ^5 h
) G4 j6 o6 b, E1 c: T/ d
return res;
/ G7 |1 C: n) N' T5 g' l/ ~0 \) V m; n& W
} |