高次元の接頭辞と研究ノート

背景:

GDSOI \テキスト{GDSOI} zsyz \テキスト{zsyz} トレーラー、 OZYrank16 \テキスト{OZYrank16} カードラインが入力されていません。
古い学生が旅行に見えた、いくつかの良いものを学ぶことがなかった見つけます。

トピック:

インクルージョン排除アプローチを考えてみましょう。
一次元のアプローチ:

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];

...
その次元を仮定するとあります T T
だから、時間の複雑さがあります n個 T * 2 T \シータ(nは^ T * 2 ^ T) です。
非常に良いああ。


実際には、もっと良い方法があります。
一次元のアプローチ:

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次元の解決後、次の次元にこの結果を継承し、と考えています。
時間計算: T n個 T \シータ(TN ^ T)
この事を使用すると、高次元とプレフィックスを計算することができます。プレフィックスとは、一般的に高次元であります n個 = 2 N = 2 の場合は、一般的に、そのようなものの要件のセットのサブセットです。
オーバー。 {上} \テキスト

おすすめ

転載: blog.csdn.net/zsyz_ZZY/article/details/89847243