救救我,这个奇怪的问题
查看原帖
救救我,这个奇怪的问题
90562
我要考北大楼主2020/10/31 22:55

只有dp函数里面//+++++++ 范围内的实现方式略微不同 可是前面的wa 后面的ac

前面的用实时更新d[x][y]

后面的先统计再更新

卡了我3天了我才发现这件事,救救我吧

https://www.luogu.com.cn/record/40962266 错 80-100行

https://www.luogu.com.cn/record/40959829

#include<bits/stdc++.h>
#define r read()
using namespace std;
inline int read()
{
	bool ok=0 ;int res=0;char c;
	while(((c=getchar())<'0'||c>'9')&&c!='-');
	if(c=='-') ok=1;else res=c-48;
	while((c=getchar())>='0'&&c<='9')res=(res<<3)+(res<<1)+(c-48);
	return ok ? ~res + 1:res;
}
int T;
int n;
double eps = 0.00001;
double d[55][55];
int vis[55][55];
double note[55][55][55];
int visn[55][55][55];
int nxt[55];
double inf=1000000000;
struct node
{
	int x,y;
}a[300];
double calc(int pi,int pj,int pk)
{
    if(pi<pj)swap(pi,pj);
    if(pi<pk)swap(pi,pk);
    if(pj<pk)swap(pj,pk);
	visn[pi][pj][pk]=1;
	double i=sqrt(1.0*(a[pi].x-a[pj].x)*(a[pi].x-a[pj].x)+1.0*(a[pi].y-a[pj].y)*(a[pi].y-a[pj].y));
	double j=sqrt(1.0*(a[pi].x-a[pk].x)*(a[pi].x-a[pk].x)+1.0*(a[pi].y-a[pk].y)*(a[pi].y-a[pk].y));
	double k=sqrt(1.0*(a[pk].x-a[pj].x)*(a[pk].x-a[pj].x)+1.0*(a[pk].y-a[pj].y)*(a[pk].y-a[pj].y));
	
	double p=(i+j+k)/2;
	
	note[pi][pj][pk]=sqrt(p*(p-i)*(p-j)*(p-k));
	return note[pi][pj][pk];
}
bool judge(int pi,int pj,int pk)
{
    if(pi<pj)swap(pi,pj);
    if(pi<pk)swap(pi,pk);
    if(pj<pk)swap(pj,pk);
	
	for(int i=0;i<n;i++)
	{
		if(i==pi||i==pj||i==pk)continue;
		if(fabs(calc(pi,pj,pk)-(calc(i,pj,pk)+calc(pi,i,pk)+calc(pi,pj,i)))<eps)return 0;
	}
	return 1;
}
double dp(int x,int y)
{
	if(vis[x][y]==1)return d[x][y];
	vis[x][y]=1;
	
	if(y-x==1)
	{
		d[x][y]=0;
		return 0;
	}else if(y-x==2)
	{
		d[x][y]=calc(x,x+1,y);
		return d[x][y];
	}

											//+++++++++++++++++++ 
		double ret=inf;						//+++++++++++++++++++++++++ 
   		for(int k=x+1;k<y;k++)
	{

         	if(judge(x,k,y)==0)continue;
         
         	double tmp=max(dp(x,k),dp(k,y));
			tmp=max(tmp,calc(x,k,y));
			
			if(d[x][y]+1<eps) d[x][y]=tmp;  //d数组初始值为-1  
			else  d[x][y]=min(d[x][y],tmp);

	}
										///+++++++++++++++++++++++++++++++
										//++++++++++++++++++++++++++++++ 
	return d[x][y];
}
int main()
{
 #ifndef ONLINE_JUDGE
	freopen("cin.txt","r",stdin);
//	freopen("cout.txt","w",stdout);
	#endif
	T=r;
	while(T--)
	{
		n=r;
		memset(vis,0,sizeof(vis));
		memset(visn,0,sizeof(visn));


		for(int i=0;i<=n;i++)
		 for(int j=0;j<=n;j++)d[i][j]=-1;
		 
		 for(int i=0;i<n-1;i++)nxt[i]=i+1;
		 nxt[n-1]=0;


		a[n].x=a[n].y=a[n+1].x=a[n+1].y=0;
		for(int i=0;i<n;i++)
		{
			a[i].x=r;
			a[i].y=r;

		}

		printf("%.1lf\n",dp(0,n-1));
	
	}

	return 0;
}
#include<bits/stdc++.h>
#define r read()
using namespace std;
inline int read()
{
	bool ok=0 ;int res=0;char c;
	while(((c=getchar())<'0'||c>'9')&&c!='-');
	if(c=='-') ok=1;else res=c-48;
	while((c=getchar())>='0'&&c<='9')res=(res<<3)+(res<<1)+(c-48);
	return ok ? ~res + 1:res;
}
int T;
int n;
const double eps = 0.00001;
double d[55][55];
int vis[55][55];
double note[55][55][55];
int visn[55][55][55];
int nxt[55];
double inf=1000000000;
struct node
{
	int x,y;
}a[300];
double calc(int pi,int pj,int pk)
{
//	printf("pi=%d pj=%d pk=%d\n",pi,pj,pk);
    if(pi<pj)swap(pi,pj);
    if(pi<pk)swap(pi,pk);
    if(pj<pk)swap(pj,pk);
//	if(visn[pi][pj][pk]==1)return note[pi][pj][pk];
	visn[pi][pj][pk]=1;
	double i=sqrt(1.0*(a[pi].x-a[pj].x)*(a[pi].x-a[pj].x)+1.0*(a[pi].y-a[pj].y)*(a[pi].y-a[pj].y));
	double j=sqrt(1.0*(a[pi].x-a[pk].x)*(a[pi].x-a[pk].x)+1.0*(a[pi].y-a[pk].y)*(a[pi].y-a[pk].y));
	double k=sqrt(1.0*(a[pk].x-a[pj].x)*(a[pk].x-a[pj].x)+1.0*(a[pk].y-a[pj].y)*(a[pk].y-a[pj].y));
	
	double p=(i+j+k)/2;
//	p=3.1415;
//	printf("%llf %llf %llf %llf \n",i,j,k,p);
	note[pi][pj][pk]=sqrt(p*(p-i)*(p-j)*(p-k));
	return note[pi][pj][pk];
}
bool judge(int pi,int pj,int pk)
{
//	return 1;
    if(pi<pj)swap(pi,pj);
    if(pi<pk)swap(pi,pk);
    if(pj<pk)swap(pj,pk);
//	if(note[pi][pj][pk]-0>eps)	return 1;
	
	for(int i=0;i<n;i++)
	{
		if(i==pi||i==pj||i==pk)continue;
		if(fabs(calc(pi,pj,pk)-(calc(i,pj,pk)+calc(pi,i,pk)+calc(pi,pj,i)))<eps)return 0;
	}
	return 1;
}
double dp(int x,int y)
{
	if(vis[x][y]==1)return d[x][y];
	vis[x][y]=1;
	
	if(y-x==1)
	{
		d[x][y]=0;
		return 0;
	}else if(y-x==2)
	{
		d[x][y]=calc(x,x+1,y);
		return d[x][y];
	}

		double ret=inf;// ++++++++++++++++++++++++++++++++++++ 
   		for(int k=x+1;k<y;k++)// +++++++++++++++++++++++++++++++++++++++++++ 
	{

         	if(judge(x,k,y)==0)continue;
         
         	double tmp=max(dp(x,k),dp(k,y));
			tmp=max(tmp,calc(x,k,y));
		
			ret=min(ret,tmp);

	}
		if(d[x][y]==-1)d[x][y]=ret;
		else d[x][y]=min(ret,d[x][y]);
							//++++++++++++++++++++++++++++++++++++++++ 
							//++++++++++++++++++++++++++++++++++++++++ 
	return d[x][y];
}
int main()
{
 #ifndef ONLINE_JUDGE
	freopen("cin.txt","r",stdin);
//	freopen("cout.txt","w",stdout);
	#endif
	T=r;
	while(T--)
	{
		n=r;
		memset(vis,0,sizeof(vis));
		memset(visn,0,sizeof(visn));

		for(int i=0;i<=n;i++)
		 for(int j=0;j<=n;j++)d[i][j]=-1;
		 
		a[n].x=a[n].y=a[n+1].x=a[n+1].y=0;
		for(int i=0;i<n;i++)
		{
			a[i].x=r;
			a[i].y=r;

		}

		printf("%.1lf\n",dp(0,n-1));

	}

	return 0;
}
2020/10/31 22:55
加载中...