zoukankan      html  css  js  c++  java
  • hdu1466 计算直线的交点数

    题意:

    平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。

    比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。


    分析:

    DP

    设状态:f[i][j]表示i条直线能否产生j个交点。

    有不同的交点数--->n条直线中有平行线。;n个点最多有n(n-1)/2个交点。

    i条直线中j(j<=i)条平行线,i-j条自由线。

    则此种交法的交点数就为(i-j)*j+k((i-j)*j为i-j条自由线与j条平行线的交点数,k为i-j条自由线的交点数  )

    则状态转移方程:f[i][j] = f[(i-j)*j+k]( f[i-j][k]为真 )


    code:

    #include <stdio.h>
    #include <string.h>
    const int maxn = 21;
    int f[maxn][191];
    void init()
    {
        int i, j, k;
        memset(f,0,sizeof(f));
        for(i=1; i<maxn; i++)
            f[i][0] = 1;
        for(i=1; i<maxn; i++)
            for(j=0; j<i; j++)
                for(k=0; k<=(i-j)*(i-j-1)/2; k++)
                    if(f[i-j][k])
                        f[i][(i-j)*j+k] = 1;
    }
    int main()
    {
        int n, i;
        init();
        while(~scanf("%d",&n))
        {
            printf("0");
            for(i=1; i<=n*(n-1)/2; i++)
                if(f[n][i])
                    printf(" %d",i);
            printf("
    ");
        }
        return 0;
    }
    


  • 相关阅读:
    AcWiing 翻硬币
    AcWing 飞行员兄弟 二进制枚举
    AcWing 费解的开关 二进制枚举
    vue发送短信逻辑
    使用celery异步发送短信
    celery配置与基本使用
    celery原理与组件
    短信验证接口
    图片验证码接口
    编写注册接口
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3217714.html
Copyright © 2011-2022 走看看