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>
#include<cstdio>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f

int main()
{
    int n,dp[22][200];
    memset(dp,0,sizeof(dp));
    dp[1][0]=1,dp[2][0]=1,dp[2][1]=1;

    for(int i=3;i<21;i++){
        dp[i][0]=1;
    }

    for(int m=3;m<=20;m++){
        for(int r=1;r<=m;r++){
            for(int i=0;i<=r*(r-1)/2;i++){    
                if(dp[r][i]){               // i为r条直线自身交点数
                        
                    dp[m][(m-r)*r+i]=1;     
                    //(m-r)*r为(m-r)条平行直线与r条直线交点数,(m-r)*r+i即为m条直线交点数
                }
            }
        }
    }

    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n*(n-1)/2;i++){
            if(dp[n][i]){
                printf("%d ",i);
            }
        }
        printf("%d\n",n*(n-1)/2);
    }

    return 0;
}
View Code

 

posted @ 2016-08-11 20:53  v9fly  阅读(219)  评论(0编辑  收藏  举报