计算直线的交点数
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8419 Accepted Submission(s): 3793
Problem Description
平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。
比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。
比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。
Input
输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(n<=20),n表示直线的数量.
Output
每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开。
Sample Input
2 3
Sample Output
0 1 0 2 3
Author
lcy
Source
解题思路:
这道题其实不难,也就是个打表dp吧。。。但是做了快1小时,才A。。。
代码:
# include<cstdio>
# include<iostream>
using namespace std;
int a[29][199];
void dabiao()
{
for ( int i = 0;i <= 20;i++ )
{
a[i][0] = 1;
}
for ( int i = 1;i <= 20;i++ )
{
for ( int j = 0;j < i;j++ )
{
for ( int k = 0;k <= 190;k++ )
{
if ( a[i-j][k] == 1 )
{
a[i][(i-j)*j+k] = 1;
}
}
}
}
}
int main(void)
{
dabiao();
int n;
while ( cin>>n )
{
cout<<"0";
for ( int i = 1;i <= 190;i++ )
{
if ( a[n][i] == 1 )
{
cout<<" "<<i;
}
}
cout<<endl;
}
return 0;
}
Q神的代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
bool p[405];
void dfs(int tot,int now,int res)
{
if(tot==0)p[res]=1;
for(int i=now;i>=1;i--)
{
if(i<=tot)
{
dfs(tot-i,i,res+i*i);
}
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(p,0,sizeof(p));
dfs(n,n,0);
bool flag=1;
for(int i=n*n;i>=1;i--)
{
if(p[i])
{
if(!flag)printf(" %d",(n*n-i)/2);
else
{
printf("%d",(n*n-i)/2);
flag=0;
}
}
}
printf("\n");
}
return 0;
}