[LeetCode] 413. Potongan Aritmetik
413 Arithmetic Slices
soalan: https://leetcode.com/problems/arithmetic-slices/description/
Perancangan yang dinamik.
Nyatakan dp [i]: menunjukkan bilangan subintervals yang meningkat sama dengan A [i].
Permulaan keadaan: dp [0] = dp [1] = 0.
Persamaan peralihan negeri:
Sekiranya A [i] - A [i - 1] == A [i - 1] - A [i - 2],
- {A [i - 2], A [i - 1], A [i]} adalah subinterval yang sama rata
- {A [i - 3], A [i - 2], A [i - 1], A [i]} juga merupakan subinterval kenaikan yang sama. Maksudnya, perbezaan antara A [i] - A [i-1] sama dengan perbezaan tambahan dalam dp [i-1].
Jadi dp [i] = 1 + dp [i-1].
persamaan:
if(A[i]-A[i-1] == A[i-1] - A[i-2]) dp[i] = dp[i-1] + 1
class Solution { public int numberOfArithmeticSlices(int[] A) { int[] dp = new int[A.length] for(int i = 2i<A.lengthi++){ if(A[i]-A[i-1] == A[i-1] - A[i-2]) dp[i] = dp[i-1] + 1 } int cnt = 0 for(int i = 2i<A.lengthi++) cnt+=dp[i] return cnt } }
Ia dapat dipermudahkan kerana syarat terakhir.
class Solution { public int numberOfArithmeticSlices(int[] A) { int[] dp = new int[A.length] int cnt = 0 for(int i = 2i<A.lengthi++){ if(A[i]-A[i-1] == A[i-1] - A[i-2]) dp[i] = dp[i-1] + 1 cnt+=dp[i] } return cnt } }
Lebih dipermudahkan kerana dp [i] hanya menggunakan dp sebelumnya [i-1]
class Solution { public int numberOfArithmeticSlices(int[] A) { int[] dp = new int[2] int cnt = 0 for(int i = 2i<A.lengthi++){ if(A[i]-A[i-1] == A[i-1] - A[i-2]){ dp[1] = dp[0] + 1 cnt+=dp[1] dp[0] = dp[1] } else dp[0] = 0 } return cnt } }