题目:平面上有n条直线,不考虑三条线交于同一点的情况,问有多少种不同的交点个数?
标签:动态规划
核心思想:若i条直线交点为k的情况存在,那么i + j条直线交点为k + j * i的情况也存在(假设这j条线是平行的)。
其中1 <= k <= n*(n-1)/2。(*)
初始状态:线平行(交点为0)的情况存在。
(*)这样组成的集合没有遗漏但会有重复。
实现代码如下:
#include<bits/stdc++.h>
using namespace std;
int p[30][330]; //p表示i条直线j个交点的情况是否存在
int main() {
int n;
cin >> n;
int m = (n - 1) * n / 2; //m为交点个数的上限
for(int i = 1; i <= n; i ++)
p[i][0] = 1; //交点为0即所有直线平行
for(int i = 2; i <= n; i ++) //i条直线
for(int j = 1; j < i; j ++) //j条直线
for(int k = 0; k <= m; k ++) {
if(p[i - j][k] == 1 && k + j * (n - j) <= m){ //如果i-j条直线k个交点的情况存在,那么i条直线k + j * (i - j)个交点的情况也存在
p[i][k + j * (i - j)] = 1;
cout << k + j * (i - j) << endl;
}
}
int cnt = 0;
for(int i = 0; i <= m; ++ i){
//if(p[n][i]) cout << i << endl;
cnt += p[n][i];
}
cout << cnt;
return 0;
}