HDU1466 计算直线的交点数
2015-08-15 01:05
417 查看
计算直线的交点数 HDU1466
题目描述
平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。 比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。Sample Input
23
Sample Output
0 10 2 3
解法
动态规划的思想,考虑dp[i]:dp[i]代表有 i 条直线时交点个数的集合
先将前 i - 1 条直线分为两组,其中一组 j 个直线与第 i 条直线平行,那么这j+1条直线与前i - 1条直线有(j+1)*(i-1-j)个交点,前(i-1-j)条直线间交点个数的集合为dp[i-1-j],那么有方程
dp[i] = { dp[i-1-j][k] + (j+1)*(i-1-j) }
其中dp[i][k]代表集合dp[i]中第k个元素的值
#include<cstdio> #include<cstring> #include<set> using namespace std; set<int> dp[21]; int main() { int N; while(~scanf("%d",&N)) { for(int i=0;i<=N;i++) { dp[i].clear(); dp[i].insert(0); } for(int i=2;i<=N;i++) { for(int j=0;j<i;j++) { int temp = (j+1)*(i-1-j); set<int>::iterator it; for(it = dp[i-1-j].begin(); it != dp[i-1-j].end(); it++) { dp[i].insert(*it + temp); } } } set<int>::iterator it = dp .begin(); for(;it != dp .end(); it++) { int temp = *it; printf("%s%d",temp?" ":"",temp); } puts(""); } return 0; }
相关文章推荐
- tableView - 自定义等高cell(frame和masonry方式)
- 八种排序算法(C语言简易版)
- tableView - 自定义等高cell-xib方式
- padding标准盒模型和怪异盒子模型
- hdu 5389 Zero Escape (dp)
- Swift-常量(let)和变量(var)
- HDU 5386 Cover(模拟)
- 快速排序的C++实现
- MFC动态创建菜单
- POJ - 3160 Father Christmas flymouse(最长路+强连通分量)
- UVA 12487 Midnight Cowboy(LCA+大YY)(好题)
- c# 动态执行脚本,相关的几个脚本引擎.
- Oracle_object_id和data_object_id的区别与联系
- jeecms: 模型管理 -
- hdu1509(Windows Message Queue) 优先队列
- 功能测试
- SSH无密码登陆
- 算法导论 10.4.5 O(1)空间遍历二叉树
- SSH-Struts2简单的自定义拦截器MethodFilterInterceptor
- 编写高质量代码改善C#程序的157个建议——建议31:在LINQ查询中避免不必要的迭代