直线交点

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;
}

猜你喜欢

转载自www.cnblogs.com/qswx/p/9492571.html