90分状压dp求调qwq,dalao们帮忙看看,救命orz
  • 板块P1433 吃奶酪
  • 楼主Yg2023
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/3/30 21:52
  • 上次更新2024/3/31 07:49:04
查看原帖
90分状压dp求调qwq,dalao们帮忙看看,救命orz
1107382
Yg2023楼主2024/3/30 21:52
#include <iostream>
//#include <stdio.h>
#include <math.h>
#include <cmath>
#include <string.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <fstream>
#include <string>
#include <map>
#include <unordered_map>
#define rd read()
#define il inline
#define ll long long
using namespace std;
double dp[1 << 16][20];
const ll big = 1e14;
struct point{
    double x, y, len;
}p[20];

il double dis(int x, int y)
{
    int a = abs(p[x].x - p[y].x), b = abs(p[x].y - p[y].y);
    double sum = a * a + b * b;
    return sqrt(sum);
}
int main(){
    int n;
    cin >> n;
    double x, y;
    for(int i = 0; i < n; ++i)
    {
        cin >> x >> y;
        p[i].x = x; p[i].y = y;
        p[i].len = sqrt(abs(x) * abs(x) + abs(y) * abs(y));
    }
    for(int i = 0; i < (1 << n); ++i)
    {
        for(int j = 0; j < n; ++j) dp[i][j] = big;
    }
    for(int i = 0; i < n; ++i)
    {
        dp[(1 << i)][i] = p[i].len;
    }
    //dp[0][0] = 0;
    for(int i = 0; i < (1 << n); ++i)
    {
        for(int j = 0; j < n; ++j)
        {
            if(i & (1 << j))
            {
                for(int k = 0; k < n; ++k)
                {
                    if(i & (1 << k)) continue;
                    dp[i | (1 << k)][k] = min(dp[i][j] + dis(j, k), dp[i | (1 << k)][k]);
                }
            }
        }
    }
    double _min = big + 10;
    ll l = 1 << n;
    for(int i = 0; i < n; ++i) _min = min(_min, dp[l - 1][i]);
    printf("%.2lf\n", _min);
    return 0;
}

用了浮点数读入,然后dp数组也初始化了比较大的值,实在没找出来哪里错了orz(调了好久),dalao们可以帮忙看看吗,谢谢了

//放组例子(#9)
// in
13
-6 1
-6 0
-5 0
-4 0
-3 0
-2 0
-1 0
1.1 0
2 0
3 0
4 0
5 0
6 0
// out
19.00
2024/3/30 21:52
加载中...