求助!!! 90pts wa.12 14
查看原帖
求助!!! 90pts wa.12 14
923827
Ysunlight楼主2024/8/20 19:02
#include <bits/stdc++.h>
using namespace std;

const long double inf=0x3f3f3f3f;
const int N=2e3+5;
int n,k,maxn=-inf;
long double dp[N][N][2],ans=inf;
stack<int> st;
struct node{
	long double x,y;
}a[N]; 

long double dis(int u,int v){
	return sqrt((a[u].x-a[v].x)*(a[u].x-a[v].x) + (a[u].y-a[v].y)*(a[u].y-a[v].y));
}
int check(int id){
	if(id <= n) return id;
	return id-n;
}
struct jump{
	int a,b,x,id;
}pre[N][N][2];

int main() {
	//freopen("tree.in","w",stdout);
	//freopen("tree.in","r",stdin);
	//freopen("tree.out","w",stdout); 
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].x>>a[i].y;
		if(maxn < a[i].y) maxn=a[i].y,k=i;
	} 
	for(int i=n+1;i<=2*n;i++){
		a[i].x=a[i-n].x;
		a[i].y=a[i-n].y;
	} 
	for(int i=1;i<=2*n;i++){
		for(int j=1;j<=2*n;j++){
			dp[i][j][0]=dp[i][j][1]=inf;
		}
	}
	dp[k][k][0]=dp[k][k][1]=0;
	dp[k+n][k+n][0]=dp[k+n][k+n][1]=0;
	
	for(int len=2;len<=n;len++){
		for(int l=1;l+len-1<=2*n;l++){
			int r=l+len-1;
			if(dp[l+1][r][0]+dis(l,l+1) < dp[l+1][r][1]+dis(l,r)){
				dp[l][r][0] = dp[l+1][r][0]+dis(l,l+1);
				pre[l][r][0].a = l+1, pre[l][r][0].b = r;
				pre[l][r][0].x = 0, pre[l][r][0].id = check(l);
			}
			if(dp[l+1][r][0]+dis(l,l+1) >= dp[l+1][r][1]+dis(l,r)){
				dp[l][r][0] = dp[l+1][r][1]+dis(l,r);
				pre[l][r][0].a = l+1, pre[l][r][0].b = r;
				pre[l][r][0].x = 1, pre[l][r][0].id = check(l);
			}
			if(dp[l][r-1][0]+dis(r,l) < dp[l][r-1][1]+dis(r,r-1)){
				dp[l][r][1] = dp[l][r-1][0]+dis(r,l);
				pre[l][r][1].a = l, pre[l][r][1].b=r-1;
				pre[l][r][1].x = 0, pre[l][r][1].id= check(r);
			}
			if(dp[l][r-1][0]+dis(r,l) >= dp[l][r-1][1]+dis(r,r-1)){
				dp[l][r][1] = dp[l][r-1][1]+dis(r,r-1);
				pre[l][r][1].a = l, pre[l][r][1].b = r-1;
				pre[l][r][1].x = 1,  pre[l][r][1].id = check(r);
			}
		}
	}
	jump pos;
	for(int i=1;i<=n+1;i++){
		if(dp[i][i+n-1][0] < ans){
			ans=dp[i][i+n-1][0];
			pos=pre[i][i+n-1][0];
		} 
		if(dp[i][i+n-1][1] < ans){
			ans=dp[i][i+n-1][1];
			pos=pre[i][i+n-1][1];
		} 
	} 
	//cout<<ans<<endl;
	while(pos.id!=0){
		st.push(pos.id);
		pos=pre[pos.a][pos.b][pos.x];
	}
	st.push(k);
	while(!st.empty()){
		cout<<st.top()<<" ";
		st.pop();
	}
	return 0;
}
/*
dp[l][r][0]=dp[l+1][r][0],dp[l+1][r][1]+dis;
dp[l][r][1]=dp[l][r-1][0],dp[l][r-1][0]+dis;

0以左边为结尾  1以右边为结尾 

3
0.000000000 0.000000000
3.000000000 0.000000000
1.000000000 1.000000000
*/
2024/8/20 19:02
加载中...