直线交点

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

转载于:https://www.cnblogs.com/qswx/p/9492571.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值