HDU1466 计算直线的交点数

来源:互联网 发布:入骨相思知不知 编辑:程序博客网 时间:2024/05/22 15:07

计算直线的交点数 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;}
0 0
原创粉丝点击