P1433 吃奶酪(搜索DFS+记忆化)

emmmmm,我还是看了题解的。。。。尴尬,其实不用记忆化搜索也是可以的。因为我不用也是最后一个点超时。但是我是用的贪心+DFS。。。超时的原因是贪心。。。。mmp,本来加贪心就是为了不超时。。。。

思路:

  搜索树的构建:就是把这一层的点把所有未访问的点当成孩子,这就构成了搜索树!

  记忆化: 就是把每个点的计算只是算一次,用个大表格记起来。。。尴尬

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
double ans = 10000000;
double now;
int n;
bool vis[20];
double x[20], y[20];
double f[20][20];

void dfs(int k, int d){
    if (now >= ans)return;
    if (k == n){ ans = min(ans, now); return; }
    for (int i = 1; i <= n;++i)
    if (!vis[i]){
        if (f[d][i]!=0){
            vis[i] = 1;
            now += f[d][i];    dfs(k + 1, i);    now -= f[d][i];
            vis[i] = 0;
        }
        else{
            vis[i] = 1;
            f[i][d] = f[d][i] = sqrt((x[i] - x[d])*(x[i] - x[d]) + (y[i] - y[d])*(y[i] - y[d]));
            now += f[i][d]; dfs(k + 1, i); now -= f[i][d];
            vis[i] = 0;
        }
    }
}

int main(){
    cin >> n;
    for (int i = 1; i <= n; ++i)cin >> x[i] >> y[i];
    vis[0] = 1;
    dfs(0, 0);
    printf("%.2lf\n", ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ALINGMAOMAO/p/10660815.html