zstu 2532 hdu 1466 计算直线的交点数

打表吧。。。
百度了一下原来最大只要n*(n-1)/2。。
一想到自己一开始定为40000还觉得小,每个节点保存的是answer,不知道每一层answer有多少个,而且有木有重复,再开了个40000多的flag数组。。居然笑了起来。。
其实200就可以了。。而且dp数组完全可以当做flag来用。。

假设我有m条线。。
我把m条线分为i个平行的 ,m-i个乱七八糟的(里面情况我不知道 想怎样怎样)
然后枚举一下m-i个的所有情况计算一下就可以了。

#include<stdio.h>
#include<string.h>
int dp[21][200];
void build()
{
    memset(dp,0,sizeof(dp));
    dp[0][0]=1;
    dp[1][0]=1;
    for(int i=2;i<=20;i++)
    {
        for(int j=0;j<=i;j++)//平行线们
        {
            for(int k=0;k<=(i-j)*((i-j)-1)/2;k++)
            {
                if(dp[i-j][k]==1)
                {
                    dp[i][k+j*(i-j)]=1;
                }
            }
        }
    }
}
int main()
{
    int n;
    build();
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<=n*(n-1)/2;i++)
        {
            if(dp[n][i]>0)
            {
                printf("%d",i);
                if(i==n*(n-1)/2)
                    printf("\n");
                else
                    printf(" ");
            }
        }
    }
    return 0;
}

你可能感兴趣的:(dp)