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

来源:互联网 发布:本科毕业论文 知乎 编辑:程序博客网 时间:2024/06/06 04:20

打表吧。。。
百度了一下原来最大只要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;}
0 0
原创粉丝点击