题目: http://acm.hdu.edu.cn/showproblem.php?pid=1466
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { int n; int r; //假设有r条非相互平行的线。 int dp[21][191]; memset(dp, 0, sizeof(dp)); for(int i=0; i<=20; i++) { dp[i][0] = 1; for(r=0; r<=i; r++) { for(int j=0; j<=190; j++) { if(dp[r][j]==1) dp[i][(i-r)*r+j] = 1; } } } while(scanf("%d", &n)!=EOF) { for(int j=0; j<=n*(n-1)/2; j++) { if(dp[n][j]==1) { if(j!=0) cout<<" "; cout<<j; } } cout<<endl; } return 0; }
状态转移方程:
m条直线的交点方案数
=(m-r)条平行线与r条直线交叉的交点数 + r条直线本身的交点方案
=(m-r)*r+r条之间本身的交点方案数(0<=r<m)
(百度: 刘春英课件(1) 有详解)。
时间: 2024-10-05 05:42:12