羅区P1433ヒューリスティック検索のチーズ+メモリを食べます

この質問はチーズを食べることです、元のデータは小さいですが、ロス管理者の谷が大幅に強化され、

DFSカードアウトが正常に問題番号1に対する解決策を練習します。

ハッハッハ練習検索、良い裸のタイトルサーチを言うのカードを出しているいくつかの意味

私はまた、DFS発見が後で問題にカードソリューションを投入して書きました

そして、ナンバーワンの問題を発見し、解決のアプローチは、私がそうであるように、全く同じではないでしょうか?

コピーローカルデータ10ダウンを実行ダウン、

FOUNDは8秒を走りました。

問題は、解決策を見つけるために、一見だけです。

次回より多くのトラブル管理者のがんデータ、問題は本当にそれに対する解決策についての更新

その後、問題の彼のソリューションをロールバックし、すべての時間が非常に古代であることを発見

このアプローチは、すべての実行を持っているようだが、DFS。

あなたは、単一検索で質問を置きたいなぜ、私は尋ねます、

代わりに年DP?


しかし、私は天国のOIerを威厳のある、あなたがあきらめることができますどのようにDFSは、検索をバースト?

だから、研究を骨の折れる、そして最終的にヒューリスティック検索の練習をしました。


注意:

ヒューリスティック検索が正の解ではありません


データので、

がん

その後、我々は質問の人々が持っています

その他の癌!


わたしの天OIerデータ指向プログラミングを十分に発揮する伝統的な美徳

(あなたは、メモリを使用することができます名前が示すように、ストレージの2次元配列)

最初は、私は、第二次元は、工程ステップの数を表す点を表します

どのようなメモリのですか?

ストレージの最短距離、

この時点まで、あなた以降のアクセスであれば、

現在は、最短距離ストレージアレイと比較距離を移動する必要があります

それが更新未満の場合、リターンよりも大きいです


私たちは、これは+貪欲な思考のメモリであることがわかりました

しかし、貪欲のメモリは、右ではありません

選択肢のすべてのステップを持っていることを後に効果

おそらく、あなたがステップI点までのステップを歩くの最短距離は、正確です

しかし、それはしない保証ステップI + 1 + 1(他の点であってもよい)への最短経路のステップを取るあるメモリ[I] [ステップ] +距離[I] [I + 1]

どのようにそれを行うには?(この時点で、コーチは、動的プログラミングを使用して思い出させる、そして正の解をDPなるかもしれません)

しかし、私はちょうどそれを行う方法をDFSを使用したいですか?

そして、今日のヒーローアウトコール - ヒューリスティック検索、

簡単に言えば、ヒューリスティック検索は、選択(または削除、無効なソリューション)からよりよい解決策を取るために、すべての分析を取ることはありませんです

キーは、コード行です。

	if(s<memory[i][step]+s2)
	{
		memory[i][step]=s;
	}

何がそれを取るためにここにs2は?

バレーIは、データポイントのテストをダウンロードすることができないため、

だから、いくつかの思考(後の混乱)の後

S2取らSQRT(0.8)検出されたすべてのテストポイントによって得ることができます

(S2の値は、場合に応じて、小さな速度に音を追求。追求を取ることができる大取られます)

そして、全体のプログラムは、速く走る- 53ms

でもポジティブソリューションDPを超え171ms

私は、変換前のデータを記録し、比較することを拒否します

コードオファーAC

#include<bits/stdc++.h>
using namespace std;
int N;
struct pue
{
	double a,b;
}; 
pue w[22];
double ans=INT_MAX;
double distance[30][35];
double memory[30][30];
bool vis[25];
double s2=sqrt(0.8);
double calculate(double x1,double y1,double x2,double y2)
{
	double ke=x1-x2,kr=y1-y2;
	return sqrt(ke*ke+kr*kr);
}
void yuchuli()
{
	for(int i=0;i<=N;i++)
	for(int j=0;j<=N;j++)
	{
		memory[i][j]=INT_MAX;
		distance[i][j]=calculate(w[i].a,w[i].b,w[j].a,w[j].b);
	}
}
void dfs(double s,int i,int step)
{
	if(s<memory[i][step]+s2)
	{
		memory[i][step]=s;
	}
	else
	return ;
	if(step==N)
	{
	if(ans>s)ans=s;
	return ;	
	}
	for(int j=1;j<=N;j++)
	{
		if(i==j)continue;
		if(vis[j]==0)
		{
		double k=s+distance[i][j];
		if(k<ans)
		{
			vis[j]=1;
			dfs(k,j,step+1);
			vis[j]=0;
		}
		}
		
		
	}
}
bool com(pue x,pue y)
{
	if(x.a!=y.a)return x.a>y.a;
	else
	return x.b>y.b;
}
int main()
{
	scanf("%d",&N);
	for(int i=1;i<=N;i++)
	{
		scanf("%lf%lf",&w[i].a,&w[i].b);
	}
	sort(w+1,w+1+N,com);//这里需要从大到小进行排序
	yuchuli();
	dfs(0.0,0,0);
	printf("%.2f",ans);
    return 0;
}

繰り返しますが、これは肯定的な解決策ではありません!

フルレンジのセットを介してデータの正当性、

人々はちょうど、私のトピックやビッグデータを変更スワップカードにできる可能性があり、

(ただし、他の数字は、S2を取るしようとすることができます)

ただ、私はそれが探索問題であることから、あなたは検索ソリューション、またはどのように価値がある、それのタイトルのを持っている必要がありますと思いますか?

それと同時に、また時には、ヒューリスティック検索を使用して、あなたを伝えるために暴力的な素晴らしさを再生するには、深い診察室で見つかりました。

私はあなたが何かを得ることができると思います。

あなたは著者が大丈夫書いたと思われる場合は、賞賛にそれを指して!


おすすめ

転載: www.cnblogs.com/poised/p/12597794.html