サブインクリメントの数との間の中距離差のアレイ
A = [0, 1, 2, 3, 4]
return: 6, for 3 arithmetic slices in A:
[0, 1, 2],
[1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3, 4],
[ 1, 2, 3, 4],
[2, 3, 4]
件名の説明:
配列を考えると、メディア部分区間差列を求めるの数が増加します。
アイデアの分析:
DPを有する動的プログラミング、[I]が配列の終わりに[i]はどれだけ増分演算部で表されます。場合[I] - [I-1] == A [I-1] - [I-2]、次に[A [I-2]、A [I-1]、A [I]構成サブ区間演算刻み。新しい部分区間がインクリメントされるだけでなくへの[I-1]部分区間プラス[I]の端を越えてインクリメントされ、形成されてもよいです。
综上、在A [1] - [I-1] == A [I-1] - [I-2]时、DP [I] = DP [I-1] + 1。
インクリメンタルサブ間隔は必ずしもないので、ほとんどの要素の端部は端に任意の要素とすることができ、累積結果DPアレイを戻す必要があります。
コード:
public int numberOfArithmeticSlices(int []A){
if(A==null||A.length==0)
return 0;
int []dp=new int [A.length];
for(int i=2;i<A.length;i++){
if(A[i]-A[i-1]==A[i-1]-A[i-2]){
dp[i]=dp[i-1]+1;
}
}
int res=0;
for(int cnt:dp)
res=res+cnt;
return res;
}