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

UVA 1543 Telescope

2016-08-29 12:27 309 查看
题目链接:http://acm.hust.edu.cn/vjudge/problem/41494



题意:一个圆上有n个点,选择其中的m个点按照顺序连成m边形,求最大的面积。



思路:dp[i][j][k],表示从i号点开始作为起点的j个点中选择k个点连成图形的最大面积,且区间内的左右边界点必须选择。

dp[i][j][k] = max( dp[i][l][k-1] + area(i,l,j) ) 枚举起点,长度,和选择点的个数k,以及第k-1个点选择的位置进行转移。

还有就是给定三个点,计算他们围成的面积,可以根据角度计算出各边长,然后用海伦公式计算面积。

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <utility>
using namespace std;

#define rep(i,j,k) for (int i=j;i<=k;i++)
#define Rrep(i,j,k) for (int i=j;i>=k;i--)

#define Clean(x,y) memset(x,y,sizeof(x))
#define LL long long
#define ULL unsigned long long
#define inf 0x7fffffff
#define mod 100000007

const int maxn = 50;
const double pi = acos(-1.0);
double x[maxn];
double dp[maxn][maxn][maxn];
double area[maxn][maxn][maxn];

double cal( int a,int b,int c )
{
double a1 = 2 * sin( min( fabs(x[a]-x[b]) , 1 - fabs(x[a]-x[b]) )*pi );
double a2 = 2 * sin( min( fabs(x[a]-x[c]) , 1 - fabs(x[a]-x[c]) )*pi );
double a3 = 2 * sin( min( fabs(x[c]-x[b]) , 1 - fabs(x[c]-x[b]) )*pi );
double p = ( a1 + a2 + a3 ) / 2;
return sqrt( p * (p-a1) * (p-a2) * (p-a3) );
}
int n,m;

void init()
{
rep(i,1,n)
rep(j,1,n)
rep(k,1,n)
if ( i != j && i != k && k != j )
area[i][j][k] = area[i][k][j] = area[j][i][k] = area[j][k][i] = area[k][i][j] = area[k][j][i] = cal( i,j,k );
}

int main()
{
while( cin>>n>>m )
{
if ( n + m == 0 ) break;
rep(i,1,n) scanf("%lf",&x[i]);
Clean(dp,0);
init();
rep(l,3,n) //长度
rep(i,1,n) //起点
{
int uplim = min( m , l ); //此区间最多选择的点数
rep( k , 3 , uplim )
Rrep(mid,l-1,2) //枚举第k-1个点的位置
{
if ( mid < k-1 ) break; //此区间长度不够k-1,放不下k-1个点
dp[i][l][k] = max( dp[i][l][k] , dp[i][mid][k-1] + area[i][ (i+mid-2)%n + 1 ][ (i+l-2)%n + 1 ] ) ;
}
}
double ans = 0;
rep(i,1,n)
rep(j,m,n)
ans = max( ans , dp[i][j][m] );
printf("%0.6f\n",ans);
}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  区间dp