文章出處
文章列表
題目: 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) 有詳解)。
文章列表
全站熱搜