Description
平面上有n条直线,且无三线共点,问这些直线能有多少种不同的交点数。
Analysis
判断各个交点数的存在性,需要采用存在性动规的状态转移。
i条直线的交点数要由j条直线转移(j<i)过来,那么i-j条直线一定要处于某种便于处理的状态。什么样的状态呢,不难想到平行,平行的各条直线无交点且与其他直线的交点数相等,便于状态转移。
接下来就是转移方程的分析,对于j条直线存在k个交点,那么i-j条平行的直线每条一定与j条直线各有一个交点,所以i条直线就存在 (i-j)·j+k 个交点。
dp[i][(i-j)·j+k]=dp[j][k]?1
Code
#include <bits/stdc++.h>
int n,exist[21][401];
int main(){
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
std::cin>>n;
exist[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
for(int k=0;k<=j*(j-1);k++)
if(exist[j][k])exist[i][k+j*(i-j)]=1;
for(int i=0;i<=400;i++)
if(exist[n][i])std::cout<<i<<std::endl;
return 0;
}