几何里面加入DP,一下子提高了难度,,,感觉还是不会,,需要不断努力才行啊,。。。。首先初始化进行一个准备,储存初始化的内容,,在进行DP
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
#define pi acos(-1)
double a[50];
double d[50][50];
double area[50][50][50];
double dp[50][50][50];
double dis(double l,double r)
{
double s=r-l;
if(s>0.5)
{
s=1-s;
}
return 2*sin(pi*(r-l));
}
double getarea(double l,double r,double t)
{
double p=(l+r+t)/2;
// printf("%.6lf %.6lf %.6lf\n",l,r,t);
p=p*(p-l)*(p-r)*(p-t);
// printf("===========%.6lf\n",p);
return sqrt(p);
}
void init(int n)
{
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
// printf("<<<<<< %.6lf\n",dis(a[i],a[j]));
d[i][j]=dis(a[i],a[j]);
d[j][i]=dis(a[i],a[j]);
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
for(int k=j+1;k<=n;k++)
{
double tmp=getarea(d[i][j],d[j][k],d[k][i]);
area[i][j][k]=tmp;
area[i][k][j]=tmp;
area[j][i][k]=tmp;
area[j][k][i]=tmp;
area[k][j][i]=tmp;
area[k][i][j]=tmp;
// printf("%.6lf\n",tmp);
}
}
double solve(int n,int m)
{
for(int p=3;p<=m;p++)
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
for(int k=j+1;k<=n;k++)
{
dp[i][k][p]=max(dp[i][k][p],dp[i][j][p-1]+area[i][j][k]);
}
}
double ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
// printf("%.6lf\n",dp[i][j][m]);
ans=max(ans,dp[i][j][m]);
}
return ans;
}
int main()
{
// freopen("in.txt","r",stdin);
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf("%lf",&a[i]);
}
init(n);
printf("%.6lf\n",solve(n,m));
}
return 0;
}