hdu 1466 计算直线的交点数

/*
	DP
	把i条直线分成那个两份:r条互相不平行的+(i-r)条平行直线(其中的每条和条互相不平行的相交都有r个交点)
	i条直线相交点数=r条直线相交点数+(i-r)*r;(1<=r<i)

*/
#include<stdio.h>
#include<string.h>
int a[21][191];
int main()
{
	memset(a,0,sizeof(a));
	int i,r,j;
	for(i=0;i<21;i++)
		a[i][0]=1;
	for(i=2;i<21;i++)
		for(r=i-1;r>=1;r--)
			for(j=0;j<191;j++)
				if(a[r][j])//r条直线可以有j个交点
					a[i][j+(i-r)*r]=1;
	int n;
	while(scanf("%d",&n)!=-1)
	{
		printf("0");
		j=n*(n-1)/2;
		for(i=1;i<=j;i++)
			if(a[n][i])
				printf(" %d",i);
		printf("\n");
	}
	return 0;
}

 

你可能感兴趣的:(hdu 1466 计算直线的交点数)