UVA - 1543 Telescope dp+几何

传送门

这题的面积每增加一个点,多的面积就是当前点与第一个点和最后一个点构成的三角形面积,可以利用海伦公式计算。我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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值