现在的位置: 首页 > 综合 > 正文

hdu1466 计算直线的交点数

2018年12月21日 ⁄ 综合 ⁄ 共 640字 ⁄ 字号 评论关闭

题意:

平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。

比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。


分析:

DP

设状态:f[i][j]表示i条直线能否产生j个交点。

有不同的交点数--->n条直线中有平行线。;n个点最多有n(n-1)/2个交点。

i条直线中j(j<=i)条平行线,i-j条自由线。

则此种交法的交点数就为(i-j)*j+k((i-j)*j为i-j条自由线与j条平行线的交点数,k为i-j条自由线的交点数  )

则状态转移方程:f[i][j] = f[(i-j)*j+k]( f[i-j][k]为真 )


code:

#include <stdio.h>
#include <string.h>
const int maxn = 21;
int f[maxn][191];
void init()
{
    int i, j, k;
    memset(f,0,sizeof(f));
    for(i=1; i<maxn; i++)
        f[i][0] = 1;
    for(i=1; i<maxn; i++)
        for(j=0; j<i; j++)
            for(k=0; k<=(i-j)*(i-j-1)/2; k++)
                if(f[i-j][k])
                    f[i][(i-j)*j+k] = 1;
}
int main()
{
    int n, i;
    init();
    while(~scanf("%d",&n))
    {
        printf("0");
        for(i=1; i<=n*(n-1)/2; i++)
            if(f[n][i])
                printf(" %d",i);
        printf("\n");
    }
    return 0;
}

抱歉!评论已关闭.