您的位置:首页 > 运维架构

UVA - 1543 Telescope dp+几何

2016-07-26 10:59 471 查看
传送门

这题的面积每增加一个点,多的面积就是当前点与第一个点和最后一个点构成的三角形面积,可以利用海伦公式计算。我wa了几发,原因是要求精度1e-6,我输出了.7f (= =),然后状态方程,刚开始一直没想到怎么转移,感觉要开一个四维的,分别表示起点,终点,个数,当前点。。。当前点其实并不需要,这一维可以省掉,于是可得到状态方程d[j][l][i] = max(d[j][l][i],d[j][k][i-1]+H(p[j],p[k],p[l]));其中H是计算j、k、l三点构成的三角形面积。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <cstdlib>
using namespace std;
const int maxn = 55;
const int mod = 1e9 + 7;
int n,m;
double p[maxn];
double d[maxn][maxn][maxn];
double cal(double p1,double p2){
double angl = p2-p1;
angl = min(angl,1-angl);
return sin(angl*acos(-1))*2;
}
double H(double p1,double p2,double p3){
double l1=cal(p2,p1),l2=cal(p3,p2),l3=cal(p3,p1);
double t = (l1+l2+l3)/2;
return sqrt(t*(t-l1)*(t-l2)*(t-l3));
}
int main(){
//freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m)&&(n+m)){
memset(d,0,sizeof d);
for(int i=1;i<=n;i++)
scanf("%lf",&p[i]);
double ans = 0;
for(int i=3;i<=m;i++)
for(int j=1;j<=n;j++)
for(int k=j+1;k<=n;k++)
for(int l=k+1;l<=n;l++)
d[j][l][i] = max(d[j][l][i],d[j][k][i-1]+H(p[j],p[k],p[l]));
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
ans = max(ans,d[i][j][m]);
printf("%.6f\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: