この質問はチーズを食べることです、元のデータは小さいですが、ロス管理者の谷が大幅に強化され、
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を取るしようとすることができます)
ただ、私はそれが探索問題であることから、あなたは検索ソリューション、またはどのように価値がある、それのタイトルのを持っている必要がありますと思いますか?
それと同時に、また時には、ヒューリスティック検索を使用して、あなたを伝えるために暴力的な素晴らしさを再生するには、深い診察室で見つかりました。
私はあなたが何かを得ることができると思います。
あなたは著者が大丈夫書いたと思われる場合は、賞賛にそれを指して!