您的位置:首页 > 其它

杭电ACM-HDOJ1466计算直线的交点数(动态规划)

2013-02-06 22:02 309 查看
/**

* problem:杭电OJ1466动态规划-计算直线的交点数

* time:2013-2-5

* 解题思路:

每次有平行线的时候,不互相平行的线(n-i)条和每条平行线都有n-i个交点,

一共(n-i)*i个交点,加上n-i条线本身的交点,就是总的交点数。

如果平行线的条数固定,n变化,n-i也就是不平行的线变化。

对于任意的n(n为正整数)条直线

有以下情况:

1条平行(全不平行)时,(n-1)条线的所有情况+(n-1)*1

2条平行,(n-2)条线的所有情况+(n-2)*2

...

i条平行,(n-i)条线的所有情况+(n-i)*i

...

n-1条平行,1条线的所有情况+ 1*(n-1)

以上所说i条平行,是指不保证其余n-i条一定不平行

*/

#include <cstdio>

#include <iostream>

using namespace std;

int main(){

int n;

int i,j;

int dp[21][200];

for(i=0;i<21;i++)

for(j=0;j<200;j++)

if(j==0)

dp[i][j]=1;

else

dp[i][j]=0;

for(n=2;n<21;n++) //线条总数

for(i=1;i<=n-1;i++) //相互平行的线的条数

for(j=0;j<200;j++) //依次遍历每种交点情况

if(dp[n-i][j]==1) //n-i条不平行的线如果有j个交点

dp
[j+(n-i)*i]=1;//加上与平行线的交点共有j+(n-i)*i个交点

while(~scanf("%d",&n)){

cout<<"0";

for(j=1;j<=n*(n-1)/2;j++)

if(dp
[j])

cout<<" "<<j;

cout<<endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: