原文链接

平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。 
比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。

Input输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(n<=20),n表示直线的数量. 
Output每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开。

Sample Input

2
3

Sample Output

0 1
0 2 3

N=1,2,3的情况:

0

0,1

0,2,3

如果已知小于N的情况,我们来分析加入第N条直线的情况(这里N=4):

1、第四条与其余直线全部平行 =>无交点;

2、第四条与其中两条平行,交点数为(n-1)*1+0=3;

3、第四条与其中一条平行,这两条平行直线和另外两点直线的交点数为(n-2)*2=4,而另外两条直线既可能平行也可能相交,因此可能交点数为:

(n-2)*2+0=4    或者         (n-2)*2+1=5

4、 第四条直线不与任何一条直线平行,交点数为:

(n-3)*3+0=3   或者 (n-3)*3+2=5    或者 (n-3)*3+3=6

即n=4时,有0个,3个,4个,5个,6个不同交点数。

上述n=4的分析过程中,我们发现:

m条直线的交点方案数

=(m-r)条平行线与r条直线交叉的交点数

+ r条直线本身的交点方案

=(m-r)*r+r条之间本身的交点方案数(1<=r<=m)

由上推出 设n条直线的交点数为fn, 平行线有(n-r)个则fn(n)=(n-r)*r+fn(r);

用dp[i][j]表示i条直线,是否有会有j个交点,如果有j个交点,则置为1,否则为0; 
 * 根据上面的方程:只要dp[r][j]=1(r条直线有j个交点是成立的),那么肯定有dp[i][(i-r)*r+j]=1;

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<map>
using namespace std;
int n;
bool dp[25][200];//190
int main() {
//freopen("in.txt", "r", stdin);
//init
memset(dp, 0, sizeof(dp));
for (int i = 0; i <= 20; i++)
{
dp[i][0] = 1;
for (int r = 0; r <= i; r++)
{
for (int j = 0; j <= 190; j++)
{
if (dp[r][j]) {
dp[i][(i - r)*r + j] = 1;
}
}
}
} while (scanf("%d",&n)!=-1)
{
printf("0");
for (int i = 1; i <= n*(n-1)/2; i++)
{
if (dp[n][i])
printf(" %d", i);
}
printf("\n");
} return 0;
}

  

hdu1466计算直线的交点数 非原创的更多相关文章

  1. HDU-1466 计算直线的交点数 经典dp

    1.HDU-1466   计算直线的交点数 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 3.总结:不会推这个,看了题解.. 状态转移: m条 ...

  2. hdu1466 计算直线的交点数

    题意: 平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数. 比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). 分析: DP 设状态:f[i][j]表示i条直线能否产生j个 ...

  3. hdu----(1466)计算直线的交点数(dp)

    计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  4. 计算直线的交点数(set + 打表)

    计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  5. G题 hdu 1466 计算直线的交点数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others)  ...

  6. HDOJ 1466 计算直线的交点数

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

  7. C++ 计算直线的交点数(动态规划)

    问题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 Problem Description 平面上有n条直线,且无三线共点,问这些直线能有多少种不同 ...

  8. 计算直线的交点数(hdu1466简单的dp)

    题意:平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数.比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). 思路:动态规划,想办法记忆化搜索,当前状态和之前状态结合起来 d ...

  9. hdu 1466 计算直线的交点数

    http://acm.hdu.edu.cn/showproblem.php?pid=1466 N条直线的交点方案数 = c 条直线交叉的交点数与(N-c)条平行线 + c 条直线本身的交点方案 = ( ...

随机推荐

  1. spring之IOC容器创建对象

    1.术语了解 1.1组件/框架设计 侵入式设计 引入了框架,对现有的类的结构有影响:即需要实现或继承某些特定类. 例如: Struts框架非侵入式设计 引入了框架,对现有的类结构没有影响. 例如:Hi ...

  2. 爬虫 之 scrapy框架

    浏览目录 介绍 安装 项目结构及爬虫应用简介 常用命令行工具 Spiders爬虫 Selectors选择器 Item Pipeline 项目管道 Downloader Middleware下载中间件 ...

  3. debian 9 更换源 使用国内源 配置方法

    配置前请先参考: https://wiki.debian.org/SourcesList https://www.debian.org/mirror/list https://mirrors.tuna ...

  4. Go 语言并发笔记

    前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...

  5. 39 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)

    题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数) public class _039PrintFu ...

  6. jQuary总结2: jQuery选择器

    1  什么是jQuery选择器 获取页面元素,并且把页面元素包装成jQuery对象的方式 2 为什么要学习jQuery选择器 为了更加方便的获取页面上的元素,并且将元素包装起来,使我们编写程序时更加便 ...

  7. 用Word 写csdn blog

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  8. zrender源码分析2--初始化Storage

    接上次分析到初始化ZRender的源码,这次关注内容仓库Storage的初始化 入口1:new Storage(); // zrender.js /** * ZRender接口类,对外可用的所有接口都 ...

  9. 【转】java中定义二维数组的几种写法

    原文链接 注:以下的 type[][] var 也可以这样申明 type var[][] type为数组的类型,var为变量名 写法一:行列固定的数组 //定义二维数组写法1 class Test { ...

  10. 微信openid

    微信openid由用户id和公众号id加密而来,同一用户相对同一公众账号的openid是不变的.