找出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" );
}
}