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