そこに大きな問題があると、特定の状態遷移ルールを示す特性の間に小さな問題を発見し、次いで溶液の条件を満たすように小さな問題を設計し、そして最後に、メモリ内の中間値迅速最終的な解決策を得ます
アレイ間隔問題は、動的プログラミングの問題で、私たちは、一般的な問題解決のアイデアの最初のを見て、動的計画問題を借りることができます
範囲合計問合せ
整数配列所与 NUMS、インデックス間の要素の和を見つける I 及び J (I ≤ J)、包括的です。
例:
この問題を解決すること与えられ、2つのインデックス間の配列は、それが明確な和= DP [J + 1]である - [I] DP次のように、コードを得ることができます。
プライベート int型[] DP; プライベート NumArray(INT [] NUMS){ DP = 新しい INT [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]。 }
2番目の質問
算術スライス
这道题就有点复杂了,设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; }