POLYGON(动态规划)
学校老师布置的一道动规的题目,要求下次上课前AC。周一一放学就回家写,调试了一会儿OK了。在这边记录一下解题的思路和过程,也作为第一篇随笔,就是随便之一写,您也就随便之一看。有问题望你指出,多多包涵。
题目描述如下:
POLYGON
源程序名 POLYGON.??? (PAS,C,CPP)
可执行文件名 POLYGON.EXE
输入文件名 POLYGON.IN
输出文件名 POLYGON.OUT
对于一个多边形来说,在该多边形内任取两点,如果这两点连成的线段落在多边形内,则称这样的多边形为凸多边形。
平面上有N个坐标值为自然数的圆点。顶点数最多凸多边形是指由给定的圆点中的一部分组成的凸多边形,它包含最大可能的顶点数。原点,即坐标内中心(0,0)必须是顶点数最多凸多边形的一个顶点。
编写程序求出这样的凸多边形的最大顶点数。注意一个多边形的连续的边不能是平行的。
输入
输入文件的第一行包含一个自然数N,2≤N≤100,表示给定的圆点数。
下面的N行每行包含两个用空格隔开的自然数X和Y,1≤X≤100,1≤Y≤100,表示一个圆点的坐标值。所有的圆点是不相同的。
输出
输出文件的第一行也是唯一的一行应该包含顶点数最多凸多边形的顶点数。注意结果应不小于3。
样例
POLYGON.IN
8
10 8
3 9
2 8
2 3
9 2
9 10
10 3
8 10
POLYGON.OUT
8
因为接触信息竞赛时间不长,老师对这道题给了两点提示:
第一点大家在下面也都想到了就是按照斜率给点进行排序再处理;
第二点就是关于判断凸多边形的问题,这里用到了向量和矩阵的知识。这里我们不妨假设斜率是按照从小到大的顺序排列。所以判断(x3,y3)就是否可以和已经构成一边的(x1,y1)、(x2,y2)构成凸多边形。(作者数学不是很好,所以推理不是很严谨)即把(x1,y1)、(x2,y2)构成的一边看作以(x1,y1)为起点,(x2,y2)为终点的向量,而点(x3,y3)就是向量外一点,如果这个向量及其延长线逆时针转一个小于180°的角可以碰到(x3,y3)则判定可以加入这个点,然后用行列式求坐标系中三角形的公式就可以得出如果x1(y2-y3)+x2(y3-y1)+x3(y1-y2)>0 则符合条件(也排除了等于0是三点共线的情况)。
最后老师在黑板上随便写下了一个动态转移方程 Fi=max{Fj+1}.
也就是这个公式是我们走了不少弯路。
因为这是一个点到另一个点的动规情况,并不是一个维度就可以描述出来的。所以我想可以这样写方程
第 i 个点到 i 后第 j 个点可以加入构成凸多边形的最多的变数为Fij ,则 Fij=max{ Fki ,1<=k<=i-1}+1 并且j 如果到了最后一个点之后就返回第一个点,这样在最后扫描一边 Fi1 就可以得到结果了。
具体不是很规范的代码如下:
#include<stdio.h>
#include<stdlib.h>
FILE *fin,*fout;
int n,f[][],max=,ans=,y[], x[];
double a[];
void qs(double a[],int x[],int y[],int left,int right){
if(left>=right) return ;
int i=left;
int j=right;
double key=a[left];
int key2=x[left],key3=y[left];
while(i < j)
{
while(i < j && key <= a[j]) j--;
{ a[i] = a[j]; x[i]=x[j];y[i]=y[j];}
while(i < j && key >= a[i]) i++;
{a[j] = a[i]; x[j]=x[i]; y[j]=y[i];}
}
a[i] = key;x[i]=key2;y[i]=key3;
qs(a,x,y,left,i-);
qs(a,x,y,i+,right);
}
int judge(int x1,int y1,int x2,int y2,int x3,int y3){
if((x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2))>) return ;
else return ;
}
int main(){
int i,j,t,k;
fin=fopen("polygon.in","r");
fout=fopen("polygon.out","w");
fscanf(fin,"%d",&n);n++;
x[]=;y[]=;
for(i=;i<=n;i++){
fscanf(fin,"%d%d",&x[i],&y[i]);
a[i]=(double)y[i]/x[i];
}
qs(a,x,y,,n);
for(i=;i<=n;i++)
f[][i]=;
for(i=;i<=n;i++)
{
for(j=i+;j<=n+;j++)
{
if(j==n+) t=;
else t=j;
for(k=;k<=i-;k++){
if(judge(x[k],y[k],x[i],y[i],x[t],y[t]))
if(f[k][i]+>f[i][t])
f[i][t]=f[k][i]+;
}
}
}
for(i=;i<=n;i++)
{
if(f[i][]>ans) ans=f[i][];
}
fprintf(fout,"%d\n",ans);
fclose(fin);
fclose(fout);
return ;
}
最后写一点总结性的,算是为以后再看时留下更有用的信息:此题动态规划时前后区间均要扫面全面,才可以使程序实现随时根据最优情况做出调成的功能。
(第一篇草草写完,很激动,吃饭去了)
——励志不做copy王
POLYGON(动态规划)的更多相关文章
- POJ-1179 Polygon (动态规划)
Polygon Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5293 Accepted: 2238 Description P ...
- {POJ}{动态规划}{题目列表}
动态规划与贪心相关: {HDU}{4739}{Zhuge Liang's Mines}{压缩DP} 题意:给定20个点坐标,求最多有多少个不相交(点也不相交)的正方形 思路:背包问题,求出所有的正方形 ...
- poj 1179 Polygon
http://poj.org/problem?id=1179 Polygon Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
- poj 动态规划题目列表及总结
此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...
- poj动态规划列表
[1]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 13 ...
- POJ 动态规划题目列表
]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322 ...
- Largest Rectangle in a Histogram(最大矩形面积,动态规划思想)
Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- poj 动态规划的主题列表和总结
此文转载别人,希望自己可以做完这些题目. 1.POJ动态规划题目列表 easy:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, ...
- poj 1179 $Polygon$(断环成链)
Polygon \(solution:\) upd:还是多讲一下,这道题基本上可以说是一道思维题.一道结论题.一道考验你动态规划基本功是否扎实的题目.因为这道题的数据范围很小,思考一下总能想到断环成链 ...
随机推荐
- 【[NOI2013]矩阵游戏】
我们看到了及其可怕的数据范围 这个样子都没有办法直接读入的数据范围应该怎么算 我们观察一下递推式\(f[i][j]=a*f[i][j]+b(j!=1)\) \(f[i][1]=c*f[i-1][m]+ ...
- c++ 单引号和双引号
c++中单引号表示一个字符,双引号表示字符串 python中单引号与双引号是一样的
- 如何从GitHub获取源代码
如何从GitHub获取源代码 github是当前流行的开源项目托管网站,里面有成千上万的项目值得学习和借鉴,可以把项目源代码下载到本地研究.本文介绍如何获取github的源代码. 方法1 - 克隆(C ...
- WPF学习笔记(7):DataGrid中数字自定义格式显示
DataGrid中数据显示如下图,数据格式比较杂乱.希望达到以下要求:(1)所有数据保留两位小数:(2)超过1000的数字显示千分位:(3)如果数据为0,不显示. 首先想到用StringFormat进 ...
- 【题解】洛谷P2532 [AHOI2012]树屋阶梯(卡特兰数+高精)
洛谷P2532:https://www.luogu.org/problemnew/show/P2532 思路 来自Sooke大佬的推导: https://www.luogu.org/blog/Sook ...
- Spring-boot官方案例分析之log4j
Spring-boot官方案例分析之log4j 运行单元测试分析: @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfigur ...
- Struts2 第一讲 -- Struts2开发前奏
我们在学习Struts之前,先来复习一下Servlet,众所周知Servlet是JavaWeb的三大组件.我们发送一个请求,这个请求交给Servlet处理,Servlet将处理的结果返还给浏览器.每个 ...
- git 指定用户名密码更新代码
使用git 更新代码 如何修改git 的密码一直令人费解,百度一堆也没给出答案.下面给一种替代方案. 例如:我们正常的代码地址 http://172.16.210.112/project/test.g ...
- java8新特性学习2
六.Stream API Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*).Stream 是 Java8 中 ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 001-006
应师兄要求,在打三月底天梯赛之前要把PTA上面的练习集刷完,所以后面的时间就献给PTA啦~ 后面每天刷的题都会把答案代码贡献出来,如果有好的思路想法也会分享一下~ 欢迎大佬提供更好的高效率算法鸭~ - ...