计算直线的交点数(hdu1466简单的dp)
题意:平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。
思路:动态规划,想办法记忆化搜索,当前状态和之前状态结合起来
dp[i][j] i是有i条直线 j代表交点个数
假设有n条直线,前n-1条直线的所有交点都知道
假设第n条线段与前n-1条平行 n条平行 交点数 0
假设第n条线段与前n-2条平行 n-1条平行 交点数 1*(n-1) (剩下那一条与n-1的平行线都有一个交点但是那两条直线有dp[1][j]) 加上以后就是n-1条平行所能组成的交点数
假设第n条线段与前n-3条平行 n-2条平行 交点数 2*(n-2) + dp[2][j]所有交点
一直到
都不平行
用标记法去重
i条直线最多有i*(i-1)/2;
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- const int N = 21,M = (N-1)*N/2;
- int dp[N+2][M+10];
- void slove()
- {
- int m = 0;
- memset(dp,0,sizeof(dp));
- dp[0][0] = 1;dp[1][0] = 1;
- for(int i = 2; i <= 20; i++)
- {
- for(int k = 0; k < i; k++)
- {
- for(int j = 0; j <= k*(k-1)/2; j++)
- {
- if(dp[k][j])
- {
- m = j + (i-k)*k;
- dp[i][m] = 1;
- }
- }
- }
- }
- }
- int main()
- {
- int n;
- slove();
- while(scanf("%d",&n) != EOF)
- {
- for(int i = 0; i <= n*(n-1)/2; i++)
- {
- if( dp[n][i] )
- printf(i == 0 ? "%d" : " %d",i);
- }
- printf("\n");
- }
- return 0;
- }
计算直线的交点数(hdu1466简单的dp)的更多相关文章
- HDU-1466 计算直线的交点数 经典dp
1.HDU-1466 计算直线的交点数 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 3.总结:不会推这个,看了题解.. 状态转移: m条 ...
- hdu----(1466)计算直线的交点数(dp)
计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- HDOJ 1466 计算直线的交点数
将n 条直线排成一个序列,直线2和直线1最多只有一个交点,直线3和直线1,2最多有两个交点,......,直线n 和其他n-1条直线最多有n-1个交点.由此得出n条直线互不平行且无三线共点的最多交点数 ...
- 计算直线的交点数(set + 打表)
计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- G题 hdu 1466 计算直线的交点数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others) ...
- hdu1466计算直线的交点数 非原创
原文链接 平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数. 比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). Input输入数据包含多个测试实例,每个测试实例占一行,每 ...
- C++ 计算直线的交点数(动态规划)
问题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 Problem Description 平面上有n条直线,且无三线共点,问这些直线能有多少种不同 ...
- hdu1466 计算直线的交点数
题意: 平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数. 比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). 分析: DP 设状态:f[i][j]表示i条直线能否产生j个 ...
- hdu 1466 计算直线的交点数
http://acm.hdu.edu.cn/showproblem.php?pid=1466 N条直线的交点方案数 = c 条直线交叉的交点数与(N-c)条平行线 + c 条直线本身的交点方案 = ( ...
随机推荐
- 【英语】Bingo口语笔记(61) - mind系列
- 《C和指针》读书笔记 第3章-数据
原创文章,转载请注明出处:http://www.cnblogs.com/DayByDay/p/3936488.html
- 【转】Linux设备驱动之I/O端口与I/O内存
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/08/2281367.html 一.统一编址与独立编址 该部分来自于:http://blog.ch ...
- vhosts.conf
<VirtualHost *:80> ServerAdmin webmaster@dummy-host.example.com DocumentRoot "/opt/lampp/ ...
- php 正则中的"i,m,s,x,e"分别表示什么
i如果设定此修正符,模式中的字符将同时匹配大小写字母.m当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前.s如果设定了此修正符,模式中的圆点元 ...
- js内置对象-Date对象
Date对象: Data对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒). 定义: //默认初始值定义: var dataName=new Date(); /*使用关键字new;Da ...
- [Papers]MHD, $\p_3\pi$, Lebesgue space [Zhang-Li-Yu, JMAA, 2013]
$$\bex \p_3\pi\in L^p(0,T;L^q(\bbR^3)),\quad \frac{2}{p}+\frac{3}{q}=2,\quad \frac{3}{2}\leq q\leq 3 ...
- C语言练习代码
1.运用for循环根据输入的金字塔层数,输出金字塔 eg: #include <stdio.h>int main(void){ int i,j,num; printf("请输入三 ...
- Collectl基础
Collectl比nmon更专业和深入的linux性能测试工具 首先是安装 $ sudo apt-get install collectl 直接输入collectl就可以看到数据 默认是CPU,硬盘, ...
- Invalid encoding name "UTF8". 报错 XML
报错:2013-07-05 10:59:49,111 ERROR [STDERR] [Fatal Error] :1:38: Invalid encoding name "UTF8" ...