90分求调
查看原帖
90分求调
776914
Zivzijun楼主2025/7/29 22:23
#include <bits/stdc++.h>
using namespace std;
const double inf = 1000000000;
int n, maxy = -inf, k;
stack<int> anss;
double x[2005], y[2005], dp[2005][2005][2], from[2005][2005][2];
double dis(int a, int b){
	return sqrt((x[a] - x[b]) * (x[a] - x[b]) + (y[a] - y[b]) * (y[a] - y[b]));
}
int main(){
	cin >> n;
	for (int i = 1; i <= n; ++i){
		cin >> x[i] >> y[i];
		x[n + i] = x[i];
		y[n + i] = y[i];
		if (y[i] > maxy){
			maxy = y[i];
			k = i;
		}
	}
	for (int len = 1; len <= n; ++len){
		for(int i = 1; i + len - 1 <= n * 2; ++i){
    		int j = i + len - 1;
    		dp[i][j][0] = inf;
    		dp[i][j][1] = inf;
		}
	}
	dp[k][k][0] = dp[k][k][1] = dp[k + n][k + n][0] = dp[k + n][k + n][1] = 0;
	from[k][k][0] = from[k][k][1] = from[k + n][k + n][0] = from[k + n][k + n][1] = k;
	for (int len = 2; len <= n; ++len){
		for(int i = 1; i + len - 1 <= n * 2; ++i){
    		int j = i + len - 1;
    		double a = dp[i + 1][j][0] + dis(i,i + 1);
    		double b = dp[i + 1][j][1] + dis(i,j);
    		if(a > b){
				dp[i][j][0] = b;
				from[i][j][0] = 1;
			}
    		else{
				dp[i][j][0] = a;
				from[i][j][0] = 0;
			}
    		a = dp[i][j - 1][1] + dis(j - 1,j);
    		b = dp[i][j - 1][0] + dis(i,j);
    		if(a > b){
				dp[i][j][1] = b;
				from[i][j][1] = 0;
			}
    		else{
				dp[i][j][1] = a;
				from[i][j][1] = 1;
			}
		}
	}
	/*
	for (int len = 2; len <= n; ++len){
		for(int i = 1; i + len - 1 <= n * 2; ++i){
    		int j = i + len - 1;
    		cout << dp[i][j][0] << " ";
		}
		cout << endl;
	}
	for (int len = 2; len <= n; ++len){
		for(int i = 1; i + len - 1 <= n * 2; ++i){
    		int j = i + len - 1;
    		cout << dp[i][j][1] << " ";
		}
		cout << endl;
	}
	for (int i = 1; i <= n; ++i){
		cout << (dp[i][i + n - 1][0]) << " " << (dp[i][i + n - 1][1]) << endl;
	}*/
	double ans = inf;
	int l = 0, r = 0, lr = 0, last = 0;
	for (int i = 1; i <= n; ++i){
		if (dp[i][i + n - 1][0] < ans){
			l = i;
			r = i + n - 1;
			lr = 0;
			last = i;
			ans = dp[i][i + n - 1][0];
		}
		if (dp[i][i + n - 1][1] < ans){
			l = i;
			r = i + n - 1;
			lr = 1;
			last = i + n - 1;
			ans = dp[i][i + n - 1][1];
		}
	}
	//cout << ans << endl;
	for (int i = 1; i <= n; ++i){
		//cout << l << " " << r << " " << lr << " " << last << endl;
		anss.push(last);
		if (lr == 0){
			
    		double a = dp[l + 1][r][0] + dis(l,l + 1);
    		double b = dp[l + 1][r][1] + dis(l,r);
    		if (abs(a - dp[l][r][lr]) < abs(b - dp[l][r][lr])){
				lr = 0;
				l += 1;
				last = l;
			}
			else{
				lr = 1;
				l += 1;
				last = r;
			}
		}
		else if (lr == 1){
			
			
    		double a = dp[l][r - 1][1] + dis(r - 1,r);
    		double b = dp[l][r - 1][0] + dis(l,r);
    		if (abs(a - dp[l][r][lr]) < abs(b - dp[l][r][lr])){
				lr = 1;
				r -= 1;
				last = r;
			}
			else{
				lr = 0;
				r -= 1;
				last = l;
			}
			
			
		}
	}
	/*
	for (int i = n; i >= 1; --i){
		anss.push(last);
		if (from[l][r][lr] == 1){
			if (lr == 1){
				l = l;
				r = r - 1;
				lr = from[l][r][lr];
				if (lr == 1){
					last = r;
				}
				else{
					last = l;
				}
			}
			else{
				l = l + 1;
				r = r;
				lr = from[l][r][lr];
				if (lr == 1){
					last = r;
				}
				else{
					last = l;
				}
			}
		}
		else{
			if (lr == 1){
				l = l;
				r = r - 1;
				lr = from[l][r][lr];
				if (lr == 1){
					last = r;
				}
				else{
					last = l;
				}
			}
			else{
				l = l + 1;
				r = r;
				lr = from[l][r][lr];
				if (lr == 1){
					last = r;
				}
				else{
					last = l;
				}
			}
		}
	}
	*/
	for (int i = 1; i <= n; ++i){
		if (anss.top() == n){
			cout << anss.top() << " ";
		}
		else{
			cout << anss.top() % n << " ";
		}
		anss.pop();
	}
	return 0;
}

90分记录

2025/7/29 22:23
加载中...