zoukankan      html  css  js  c++  java
  • hdu 1466 计算直线的交点数 递推

    以前做这道题目的时候,花了好长时间找规律,感觉十分高大上,今天回顾这个题目的时候,突然有了顿悟,

      有了递推的思想就容易解决了。

    题意:给你n条直线,问:输出这些直线所有相交情况下的交点个数(升序输出)

    解题思路:我们可以从n-1条直线相交的情况推导出n条直线的相交情况,考虑到直线的关系不是相交就是平行,我们可以推倒一下n=4的情况:

      已知n=3时有0,2,3;

      (1):第四条直线与前三条平行,则有0;

      (2):第四条直线与其中两条平行,则有3;

      (3):第四条直线与其中一条平行,则有4,5;

      (4):第四条直线不与任何直线平行,则有3,5,6;

      大致可以知道当有j条边与第n条直线不平行是时候有(n-j)*j加上j条直线的交点,

      得出状态dp[j][j条边的交点]存在,得出状态dp[n][(n-j)*j+j条直线的交点]存在,

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define N 200//当n=20的时候交点数目最多为n*(n-1)/2 < 200
     4 
     5 int dp[21][N];//dp[直线的总数][交点的个数] = 状态(本状态存在为1,否则为0)
     6 int main ()
     7 {
     8     int i, n, j, k;
     9     for (i=0; i<21; i++)
    10         dp[i][0] = 1;//所有的直线都平行
    11     for (i=2; i<21; i++)//枚举n的值,并且打标
    12         for (j=1; j<i; j++)//枚举与i相交的边的数目
    13             for (k=0; k<N; k++)//枚举j条边的交点情况
    14                 if (dp[j][k])//如果存在则推论成功
    15                     dp[i][(i-j)*j+k] = 1;
    16     while (scanf ("%d", &n) != EOF)
    17     {
    18         for (i=0; i<N; i++)
    19         {
    20             if (dp[n][i])
    21             {
    22                 if (i)
    23                     printf (" ");
    24                 printf ("%d", i);
    25             }
    26         }
    27         printf ("
    ");
    28     }
    29 }
    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    机器学习学习记录【持续更新】——pandas
    机器学习学习记录【持续更新】——降低损失
    Robcup2D足球学习记录【2020.01.30】
    Robcup2D足球学习记录【2020.01.18】
    Robcup2D足球学习记录【2020.01.14】
    javacript window对象
    mybatis if 语句嵌套
    hashMap 和 linkedHashMap 的区别和联系
    var let const的一些区别
    Jetty9开发(1)
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4107907.html
Copyright © 2011-2022 走看看