uva1543
2015-03-18 15:58
267 查看
dp[i][j][k] 从第i个点到第j个点之间取k个点去的面积的最大值
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn = 100; const double pi = acos(-1.0); double d[maxn][maxn],dp[maxn][maxn][maxn]; int n,m; double p[maxn],area[maxn][maxn][maxn]; double dis(int i,int j) { double x=p[j]-p[i]; if(x>0.5) x=1-x; return 2*sin(x*pi); } double getarea(double i,double j,double k) { double tp = (i+j+k)/2.0; return sqrt(tp*(tp-i)*(tp-j)*(tp-k)); } void init() { for(int i=0; i<n; i++) scanf("%lf",&p[i]); for(int i=0; i<n; i++) for(int j=i+1; j<n; j++) d[i][j]=d[j][i]=dis(i,j); for(int i=0; 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]=area[i][k][j]=area[j][i][k]=area[j][k][i]=area[k][i][j]=area[k][j][i]=tmp; } } int solve() { memset(dp,0,sizeof(dp)); for(int i=3; i<=m; i++) for(int x=0; x<n; x++) for(int y=x+1; y<n; y++) for(int z=y+1; z<n; z++) { dp[x][z][i]=max(dp[x][z][i],dp[x][y][i-1]+area[x][y][z]); } double cnt=0; for(int i=0; i<n; i++) for(int j=i+1; j<n; j++) { cnt=max(dp[i][j][m],cnt); } printf("%lf\n",cnt); } int main() { while(scanf("%d %d",&n,&m)) { if(n==0&&m==0)break; init(); solve(); } return 0; }
相关文章推荐
- 【Uva 1543】Telescope
- uva 1543 Telescope
- Telescope UVA - 1543
- UVA 1543 Telescope
- uva 1543 - Telescope(dp+几何)
- UVA 1543 - Telescope(dp+几何)
- UVA - 1543(dp)
- uva 1543 dp
- UVA - 1543 Telescope dp+几何
- UVA - 1543 Telescope——最优三角剖分
- 【UVA1543】Telescope
- uva 11377 - Airport Setup
- uva 10130 超级市场
- uva 141 The Spot Game(STL set)
- UVA 11090 - Going in Cycle!! SPFA
- UVA10617- Again Palindrome
- uva 10020 Minimal coverage 【贪心】+【区间完全覆盖】
- UVA - 1330 City Game
- UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)
- UVA - 424 Integer Inquiry