[HDU 1466]计算直线的交点数(DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466

思路:我们知道n条直线得到的最多交点数为(n-1)n/2,据此可以推测数组的大小。而如果n条直线的交点个数<n(n-1)/2,则说明有直线和直线平行,这种情况下,我们设r条直线互不平行,假如r条直线有j个交点成立,有n-r条平行直线分别和r条互不平行直线相交,新增交点n-r个,n条直线得到交点个数为j+(n-r)*r

#include <iostrea
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>

#define MAXN 30
#define MAXM 200

using namespace std;

bool f[MAXN][MAXM]; //f[i][j]=true表明i条线段j个交点的方案存在

void getF()
{
    for(int i=0;i<=20;i++)
        for(int j=0;j<=191;j++)
        {
            if(j==0) f[i][j]=true; //i条线段无交点,即i条线段互相平行,该情况存在
        }
    for(int i=0;i<=20;i++)
        for(int r=0;r<i;r++) //枚举互不平行的直线数r
            for(int j=0;j<=191;j++)
            {
                if(f[r][j])
                    f[i][(i-r)*r+j]=true;
            }
}

int main()
{
    getF();
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n*(n-1)/2;i++)
            if(f[n][i])
                printf("%d ",i);
        printf("%d\n",n*(n-1)/2);
    }
    return 0;
}
时间: 2024-10-12 11:35:42

[HDU 1466]计算直线的交点数(DP)的相关文章

hdu 1466 计算直线的交点数

http://acm.hdu.edu.cn/showproblem.php?pid=1466 N条直线的交点方案数 = c 条直线交叉的交点数与(N-c)条平行线 + c 条直线本身的交点方案 = (N - c) * c  + c 条直线之间的交点数. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 int dp[21][200]; 7

G题 hdu 1466 计算直线的交点数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8799    Accepted Submission(s): 3973 Problem Description 平面上有n条直线,且无三线共点,问这些直线能有多少种不同

hdu 1466 计算直线的交点数 动态规划第一题

计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8578    Accepted Submission(s): 3857 Problem Description 平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数. 比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). Input 输入数据包含多

hdu 1466 计算直线的交点数 递推

以前做这道题目的时候,花了好长时间找规律,感觉十分高大上,今天回顾这个题目的时候,突然有了顿悟, 有了递推的思想就容易解决了. 题意:给你n条直线,问:输出这些直线所有相交情况下的交点个数(升序输出) 解题思路:我们可以从n-1条直线相交的情况推导出n条直线的相交情况,考虑到直线的关系不是相交就是平行,我们可以推倒一下n=4的情况: 已知n=3时有0,2,3; (1):第四条直线与前三条平行,则有0; (2):第四条直线与其中两条平行,则有3; (3):第四条直线与其中一条平行,则有4,5; (

Hdoj 1466 计算直线的交点数 【DP】

计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8630 Accepted Submission(s): 3885 Problem Description 平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数. 比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). Input 输入数据包含多个测试实例,

杭电 1466 计算直线的交点数

Description 平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数. 比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). Input 输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(n<=20),n表示直线的数量. Output 每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开. Sample Input 2 3 Sample Output 0 1 0 2 3 1条线:0 2条线:0

【HDOJ】1466 计算直线的交点数

找了个规律. 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define MAXN 21 6 7 int buf[MAXN][150]; 8 int lens[MAXN]; 9 10 int comp(const void *a, const void *b) { 11 return *(int *)a - *(int *)b; 12 } 13 14 int main() {

hdu1466 计算直线的交点数(找规律+数学)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 计算直线的交点数 Problem Description 平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数. 比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). Input 输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(n<=20

HDU-1466 计算直线的交点数 经典dp

1.HDU-1466   计算直线的交点数 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 3.总结:不会推这个,看了题解.. 状态转移: m条直线方案数=(m-r)条平行直线与r条直线相交数+r条直线自身方案数 #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #