HDU 1466 求直线交点 动态规划

首先自我检讨一下,最近忙一些杂事导致OJ与红宝进度严重滞后,今后要学会专注,回避一些不必要的事情。

为了准备12日的校赛做了这题,动态规划,在网上看到的很经典的解法摘录如下:

 

题目分析:

将n条直线排成一个序列,直线2和直线1最多只有一个交点,直线3和直线1和直线2最多有两个交点......直线n和其他n-1条直线最多有n-1个交点,由此得出n条直线互不平行且无三线共点的最多交点数:

max=1+2+...+(n-1)=n(n-1)/2;
设数组
     g[1..max],g[i]=0;   //交点数i不存在
     g[i]=1;             //交点数i存在(0<=i<=max)
    m条直线的交点方案数=(m-r)条平行线与r条直线交叉的交点数+r条直线本身的交点方案=(m-r)*r+r条之间本身的交点方案(1<=r<=m)
上式说明,计算不同交点方案的问题是可以递归的,可描述成如下算法
  void F(int m,int j)  //m为直线,j为交点数
  {   

if(m>0)            //若直线存在,则递归计算所有的交叉情况
        for(int r=m;r>=1;r--)
            F(m-r,j+r*(m-r));
      else
         g[j]=1;
   }               //确定n条直线存在j个交点
有了上述递归程序后,便可以通过下述方法计算和输出n条直线的交点方案
   1.计算max=n*(n-1)/2   计算最多交点数
   2.初始化数组g
   3.递归求g[i]:F(n,0)
   4.输出

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值