이 큰 문제가 있고 특성 사이의 작은 문제가 특정 상태 전이 규칙을 나열 찾은 다음 솔루션의 조건을 충족하는 작은 문제를 설계하고, 마지막으로 메모리의 중간 값 신속하게 최종 솔루션을 얻을
배열 간격 문제는 동적 프로그래밍 문제는, 우리가 처음에 동적 프로그래밍 일반 문제 해결 방안 문제, 모양을 빌릴 수있다
범위 합계 쿼리
정수 어레이 주어 nums , 인덱스 간의 원소들의 합 찾아 I 및 J ( I ≤ J )를 포함한다.
예:
: DP [I], 코드는 다음과 같이 획득 될 수있다 - 주어진 질문이 두 지표 간의 배열을 해결하는 것이 분명 합 DP = [J + 1] 인
개인 INT [] DP; 개인 NumArray ( INT []는 nums) { DP는 = 새로운 지능 [nums.length + 1 ]; DP [ 0] = 0 ; 위한 ( INT I = 0; I <nums.length; I ++ ) { DP [I +1 = nums [I] + DP [I]; } } 전용 INT sumRange ( INT I, INT의 J) { 복귀 DP [J + 1] - DP [I]; }
두 번째 질문
산술 조각
这道题就有点复杂了,设A=[0,1,2,3,4],我们先设dp[i]是以A[i]为结尾的等差递增子区间的个数,当 A[i] - A[i-1] == A[i-1] - A[i-2],那么 [A[i-2], A[i-1], A[i]] 构成一个等差递增子区间。而且在以 A[i-1] 为结尾的递增子区间的后面再加上一个 A[i],一样可以构成新的递增子区间。
综上,在 A[i] - A[i-1] == A[i-1] - A[i-2] 时,dp[i] = dp[i-1] + 1。
因为递增子区间不一定以最后一个元素为结尾,可以是任意一个元素结尾,因此需要返回 dp 数组累加的结果。
代码如下所示:
private int numberOfArithmeticSlices(int[] A){ if (A == null || A.length == 0) { return 0; } int n = A.length; int[] dp = new int[n]; for (int i = 2; i < n; i++) { if (A[i] - A[i - 1] == A[i - 1] - A[i - 2]) { dp[i] = dp[i - 1] + 1; } } int total = 0; for (int cnt : dp) { total += cnt; } return total; }