转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466
2 3
0 1 0 2 3
代码如下:
#include <cstring>
#include <iostream>
using namespace std;
#define N 21
#define M (N-1)*N/2
int dp[N][M];
//dp[i][j] i是有i条直线 j代表交点个数
void solve()
{
int m = 0;
memset(dp,0,sizeof(dp));
dp[0][0] = 1,dp[1][0] = 1;
for(int i = 2; i <= 20; i++)
{
for(int k = 0; k < i; k++)
{
for(int j = 0; j <= k*(k-1)/2; j++)
{
if(dp[k][j])
{
m = j+k*(i-k);
dp[i][m] = 1;//标记
}
}
}
}
}
int main()
{
int n;
solve();
while(~scanf("%d",&n))
{
printf("0");
for(int i = 1; i <= n*(n-1)/2; i++)
{
if(dp[n][i])
{
printf(" %d",i);
}
}
printf("\n");
}
return 0;
}hdu1466 计算直线的交点数(找规律+数学),布布扣,bubuko.com
原文地址:http://blog.csdn.net/u012860063/article/details/37530747