还是上周实验课上小学妹问的一道题。
首先能比较容易得计算出20条线段最多有不超过190个交点。对于i条线段,可以由j(j<i)条线段有k个交点这种情况推出来dp[j][k+j*(i-j)]这种情况是合法的。
如果dp[j][k]这种情况合法,那么对于i(i>j)条线段来说,dp[i][k+(i-j)*j]一定合法。
#include<stdio.h>
#include<string.h>
int dp[21][200];
int main()
{
memset(dp,0,sizeof(dp));
for(int i=0; i<=20; i++)
dp[i][0]=1;
for(int i=2; i<=20; i++)
{
for(int j=1; j<i; j++)
{
for(int k=0; k<=190; k++)
{
if(dp[j][k]==1)
dp[i][k+j*(i-j)]=1;
}
}
}
int n;
while(scanf("%d",&n)!=EOF)
{
int flag=0;
for(int i=0; i<=190; i++)
{
if(dp[n][i]==1&&!flag)
{
printf("%d",i);
flag=1;
}
else if(dp[n][i]==1)
printf(" %d",i);
}
printf("\n");
}
return 0;
}