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;
}
这题的面积每增加一个点,多的面积就是当前点与第一个点和最后一个点构成的三角形面积,可以利用海伦公式计算。我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;
}
相关文章推荐
- linux time
- 两种方式实时监控TextField的输入情况
- linux笔记:shell基础-环境变量配置文件
- 全套支付宝系统架构(内部架构图)
- centos系统出现Read-only file system的解决方案
- Apache Shiro学习笔记(二)身份验证subject.login过程
- Jenkins+Docker搭建持续集成测试环境
- 安装svn完成以后,下拉项目一直都是operation in progress
- Tomcat单机多实例配置
- Codeforces Round #357 (Div. 2) C. Heap Operations(优先队列)
- VMware 安装CentOS
- maven创建web报Cannot read lifecycle mapping metadata for artifact org.apache.maven.plugins
- proxy 在centos7上的使用方法 (不定期更新)
- 从内核的角度看linux文件系统以及一些类似于mount命令的原理(未完)
- 【Openfire】网页版单对单聊天实例
- linux --- JDK安装
- Nginx+uWSGI+Swift
- Linux安装必备知识
- Linux---RAID 管理
- DOM元素的Attribute(特性)和Property(属性) 【转载】