只有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;
}