HDU 1466 求直线交点 动态规划
2010-12-08 21:46
176 查看
首先自我检讨一下,最近忙一些杂事导致OJ与红宝进度严重滞后,今后要学会专注,回避一些不必要的事情。
为了准备12日的校赛做了这题,动态规划,在网上看到的很经典的解法摘录如下:
l 题目分析:
将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.输出
为了准备12日的校赛做了这题,动态规划,在网上看到的很经典的解法摘录如下:
l 题目分析:
将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.输出
#include <iostream> #include <cstring> using namespace std; int g[200]; void F(int m,int j){ if (m > 0) for (int r = m;r >= 1;r--) { F(m-r,j+r*(m-r)); } else g[j] = 1; } int main(){ int n,max; while (cin>>n) { max = n*(n-1)/2; memset(g,0,sizeof(g)); F(n,0); int tatol = 0; cout << '0'; for (int i = 1; i <= max;i++) { if (g[i] == 1) cout<<' '<<i; } cout<<endl; } return 0; }
相关文章推荐
- hdu 1466 计算直线的交点数(动态规划)
- hdu 1466 计算直线的交点数(动态规划)
- hdu 1466 计算直线的交点数 动态规划第一题
- hdu 1466 计算直线的交点数 动态规划第一题
- HDU 1466 计算直线的交点数(动态规划)
- 动态规划 HDU 1466 计算直线的交点数
- hdu 1466 计算直线的交点数
- HDU 1466 计算直线的交点数
- hdu 1466 计算直线的交点数
- HDU 1466 计算直线的交点数
- HDU 1466 计算直线的交点数
- HDU 1466 计算直线的交点数
- HDU 1466 计算直线的交点数 dp晕
- HDU---1466-计算直线的交点数(DP)
- hdu 1466 计算直线的交点数 (简单的动态规划)
- hdu 1466 计算直线的交点数
- HDOJ-----1466---计算直线的交点数---动态规划
- HDU 1466 计算直线的交点
- HDU 1466 计算直线的交点数
- HDU - 1466 计算直线的交点数 (dp)