hdu1466 计算直线的交点数

找出n条线有多少种不同的交点。从小到大输出。

dp[i][j] == 1表示 i 条线有 j 个交点。

也是看了别人的题解才弄明白

i 条线最多有 i * ( i - 1 ) / 2 个交点

i 条线有多少交点。

考虑 j 条 平行线,和 i - j条自由线。k 表示 i - j条自由线的交点。

则此时 i 条线可有 i * ( i - j ) + k 个交点



#include <stdio.h>
#include <string.h>

int dp[21][205];                                                                                                                 
void Dp ( ) {
    int i, j, k;
    memset ( dp, 0, sizeof ( dp ) );
    for ( i = 0; i <= 20; ++i ) 
        dp[i][0] = 1;
    for ( i = 1; i <= 20; ++i ) 
        for ( j = 0; j <= i; ++j )
            for ( k = 0; k <= ( i - j ) * ( i - j - 1 ) / 2; ++k )
                if ( dp[i - j][k] == 1 )
                    dp[i][( i - j ) * j + k] = 1;
}


int main ( ) {
    int ct;
    while ( scanf ( "%d", &ct ) != EOF ) {
        Dp( );
        printf ( "0" );
        for ( int i = 1; i <= ct * ( ct - 1 ) / 2; ++i )
            if ( dp[ct][i] == 1 ) printf ( " %d", i );
        printf ( "\n" );
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值