背景:
トレーラー、
カードラインが入力されていません。
古い学生が旅行に見えた、いくつかの良いものを学ぶことがなかった見つけます。
トピック:
インクルージョン排除アプローチを考えてみましょう。
一次元のアプローチ:
for(int i=1;i<=n;i++)
sum[i]=sum[i-1]+a[i];
二次元のアプローチ:
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
三次元のアプローチ:
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<=q;k++)
sum[i][j][k]=sum[i-1][j][k]+sum[i][j-1][k]+sum[i][j][k-1]
-sum[i-1][j-1][k]-sum[i-1][j][k-1]-sum[i][j-1][k-1]
+sum[i-1][j-1][k-1]+a[i][j][k];
その次元を仮定するとあります
。
だから、時間の複雑さがあります
です。
非常に良いああ。
実際には、もっと良い方法があります。
一次元のアプローチ:
for(int i=1;i<=n;i++)
a[i]+=a[i-1];
二次元のアプローチ:
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[i][j]+=a[i-1][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[i][j]+=a[i][j-1];
三次元のアプローチ:
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<=q;k++)
a[i][j][k]+=a[i-1][j][k];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<=q;k++)
a[i][j][k]+=a[i][j-1][k];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<=q;k++)
a[i][j][k]+=a[i][j][k-1];
それは理解できるだろう。
あなたはその上で、1次元の解決後、次の次元にこの結果を継承し、と考えています。
時間計算:
。
この事を使用すると、高次元とプレフィックスを計算することができます。プレフィックスとは、一般的に高次元であります
の場合は、一般的に、そのようなものの要件のセットのサブセットです。