hiho1360 凸多边形

来源:互联网 发布:微信自媒体 知乎 编辑:程序博客网 时间:2024/06/02 04:01
/*
类型floyd,dp
dp[i][j][k]:起点i,终点j,k个点的凸多边形面积
dp[i][j][k]=max(dp[i][j][k],dp[i][u][k-1]+area[u][j][i]))
*/
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<stdio.h>
using namespace std;

struct Point
{
    int x,y;
};
Point p[102];

int N,M;
double dp[102][102][102];
double area[102][102][102];

double s(int i,int j,int k)
{
    return 0.5*(p[i].x*p[j].y+p[j].x*p[k].y+p[k].x*p[i].y-p[i].x*p[k].y-p[j].x*p[i].y-p[k].x*p[j].y);
}

int main()
{
    cin>>N>>M;
    for(int i=0;i<N;i++)
    {
        cin>>p[i].x>>p[i].y;
    }

    memset(dp,0,sizeof(dp));
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < N; j++)
        {
            for(int k = 0; k < N; k++)
            {
                area[i][j][k] = fabs(s(i, j, k));
            }
        }
    }

    for(int k=3;k<=M;k++)
    {
        for(int i=0;i<N;i++)
        {
            for(int j=i+1;j!=i;j=(j+1)%N)//除了i点枚举
            {
                for(int u=i+1;u!=j;u=(u+1)%N)//除了j点枚举
                    dp[i][j][k]=max(dp[i][j][k],dp[i][u][k-1]+area[u][j][i]);
            }
        }
    }
    double maxx=0;
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
            maxx=max(maxx,dp[i][j][M]);
    }
    printf("%.2f\n",maxx);
}

0 0
原创粉丝点击