您的位置:首页 > 其它

HDU1466 计算直线的交点数

2015-08-15 01:05 417 查看

计算直线的交点数 HDU1466

题目描述

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

Sample Input

2

3

Sample Output

0 1

0 2 3

解法

动态规划的思想,考虑dp[i]:

dp[i]代表有 i 条直线时交点个数的集合

先将前 i - 1 条直线分为两组,其中一组 j 个直线与第 i 条直线平行,那么这j+1条直线与前i - 1条直线有(j+1)*(i-1-j)个交点,前(i-1-j)条直线间交点个数的集合为dp[i-1-j],那么有方程

dp[i] = { dp[i-1-j][k] + (j+1)*(i-1-j) }

其中dp[i][k]代表集合dp[i]中第k个元素的值

#include<cstdio>
#include<cstring>
#include<set>

using namespace std;

set<int> dp[21];

int main()
{
int N;
while(~scanf("%d",&N))
{
for(int i=0;i<=N;i++)
{
dp[i].clear();
dp[i].insert(0);
}

for(int i=2;i<=N;i++)
{
for(int j=0;j<i;j++)
{
int temp = (j+1)*(i-1-j);
set<int>::iterator it;
for(it = dp[i-1-j].begin(); it != dp[i-1-j].end(); it++)
{
dp[i].insert(*it + temp);
}
}
}
set<int>::iterator it = dp
.begin();
for(;it != dp
.end(); it++)
{
int temp = *it;
printf("%s%d",temp?" ":"",temp);
}
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: