zoukankan      html  css  js  c++  java
  • 计算直线的交点数(hdu1466简单的dp)

    题意:平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。

    思路:动态规划,想办法记忆化搜索,当前状态和之前状态结合起来

    dp[i][j] i是有i条直线 j代表交点个数

    假设有n条直线,前n-1条直线的所有交点都知道

    假设第n条线段与前n-1条平行 n条平行    交点数   0

    假设第n条线段与前n-2条平行 n-1条平行 交点数   1*(n-1) (剩下那一条与n-1的平行线都有一个交点但是那两条直线有dp[1][j]) 加上以后就是n-1条平行所能组成的交点数

    假设第n条线段与前n-3条平行 n-2条平行 交点数   2*(n-2) + dp[2][j]所有交点

    一直到

    都不平行

    用标记法去重

    i条直线最多有i*(i-1)/2;

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int N = 21,M = (N-1)*N/2;
    int dp[N+2][M+10];
    
    void slove()
    {
        int m = 0;
        memset(dp,0,sizeof(dp));
        dp[0][0] = 1;dp[1][0] = 1;
        for(int i = 2; i <= 20; i++)
        {
            for(int k = 0; k < i; k++)
            {
                for(int j = 0; j <= k*(k-1)/2; j++)
                {
                    if(dp[k][j])
                    {
                        m = j + (i-k)*k;
                        dp[i][m] = 1;
                    }
                }
            }
        }
    }
    int main()
    {
        int n;
        slove();
        while(scanf("%d",&n) != EOF)
        {
            for(int i = 0; i <= n*(n-1)/2; i++)
            {
               if( dp[n][i] )
                 printf(i == 0 ? "%d" : " %d",i);
            }
            printf("
    ");
        }
        return 0;
    }


  • 相关阅读:
    DICOM 协议学习笔记之 What is DICOM
    决策树(ID3,C4.5,CART)
    支持向量机(support vector machines, SVM)
    回归分析-线性回归与逻辑回归
    第8章 线程
    第7章 常用实用类
    第5章 语法制导翻译及中间代码生成
    第4章 语法分析
    第3章 词法分析
    第2章 形式语言基础知识
  • 原文地址:https://www.cnblogs.com/riskyer/p/3395204.html
Copyright © 2011-2022 走看看