计算直线的交点数 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[N].begin();
for(;it != dp[N].end(); it++)
{
int temp = *it;
printf("%s%d",temp?" ":"",temp);
}
puts("");
}
return 0;
}