码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1466 计算直线的交点数 动态规划第一题

时间:2015-04-21 22:50:16      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:hdu   acm   dp   动态规划   

计算直线的交点数

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8578    Accepted Submission(s): 3857


Problem Description
平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。
比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。
 

Input
输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(n<=20),n表示直线的数量.
 

Output
每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开。
 

Sample Input
2 3
 

Sample Output
0 1 0 2 3
 

Author
lcy
 

Source
ACM暑期集训队练习赛(九)

看了杭电课件的分析

容易列举出N=1,2,3的情况:

0

0,1

0,2,3

如果已知小于N的情况,我们来分析加入第N条直线的情况(这里N=4):

1、第四条与其余直线全部平行 =>无交点;

2、第四条与其中两条平行,交点数为(n-1)*1+0=3;

3、第四条与其中一条平行,这两条平行直线和另外两点直线的交点数为(n-2)*2=4,而另外两条直线既可能平行也可能相交,因此可能交点数为:

                   (n-2)*2+0=4    或者         (n-2)*2+1=5    

4、 第四条直线不与任何一条直线平行,交点数为:

      (n-3)*3+0=3   或者 (n-3)*3+2=5    或者 (n-3)*3+3=6

即n=4时,有0个,3个,4个,5个,6个不同交点数。

上述n=4的分析过程中,我们发现:

m条直线的交点方案数

=(m-r)条平行线与r条直线交叉的交点数

    + r条直线本身的交点方案

=(m-r)*r+r条之间本身的交点方案数(1<=r<=m)

由上推出 设n条直线的交点数为fn, 平行线有(n-r)个则fn(n)=(n-r)*r+fn(r);


  用dp[i][j]表示i条直线,是否有会有j个交点,如果有j个交点,则置为1,否则为0;
 * 根据上面的方程:只要dp[r][j]=1(r条直线有j个交点是成立的),那么肯定有dp[i][(i-r)*r+j]=1;

#include <stdio.h>
#include <cstring>
int main()
{
	int dp[21][191];//因为n<=20  n条直线最多交点数=n*(n-1)/2  即为190;
	memset(dp,0,sizeof(dp));//初始化为dp数组为0
	for(int i=0;i<=20;i++)
	{
		dp[i][0]=1;    //交点为0,也就是都平行,这个每组都满足
		for(int r=0;r<=i;r++)
		{
			for(int j=0;j<=190;j++)
			{
				if(dp[r][j])
				{
					dp[i][(i-r)*r+j]=1;  
				}
			}
		}
	}
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=0;i<=n*(n-1)/2;i++)  //最多有n*(n-1)/2个交点
		{
			if(dp[n][i])
			{
				if(i!=0)
					printf(" ");
				printf("%d",i);
			}
		}
		printf("\n");
	}
	return 0;
}



hdu 1466 计算直线的交点数 动态规划第一题

标签:hdu   acm   dp   动态规划   

原文地址:http://blog.csdn.net/chaiwenjun000/article/details/45174045

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!