计算直线的交点数(hdu1466简单的dp)

计算直线的交点数(hdu1466简单的dp)

题意:平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。

思路:动态规划,想办法记忆化搜索,当前状态和之前状态结合起来

dp[i][j] i是有i条直线 j代表交点个数

假设有n条直线,前n-1条直线的所有交点都知道

假设第n条线段与前n-1条平行 n条平行 交点数 0

假设第n条线段与前n-2条平行 n-1条平行 交点数 1*(n-1) (剩下那一条与n-1的平行线都有一个交点但是那两条直线有dp[1][j]) 加上以后就是n-1条平行所能组成的交点数

假设第n条线段与前n-3条平行 n-2条平行 交点数 2*(n-2) + dp[2][j]所有交点

一直到

都不平行

用标记法去重

i条直线最多有i*(i-1)/2;

#include

#include

#include

using namespace std;

const int N = 21,M = (N-1)*N/2;

int dp[N+2][M+10];

void slove()

{

int m = 0;

memset(dp,0,sizeof(dp));

dp[0][0] = 1;dp[1][0] = 1;

for(int i = 2; i <= 20; i++)

{

for(int k = 0; k < i; k++)

{

for(int j = 0; j <= k*(k-1)/2; j++)

{

if(dp[k][j])

{

m = j + (i-k)*k;

dp[i][m] = 1;

}

}

}

}

}

int main()

{

int n;

slove();

while(scanf("%d",&n) != EOF)

{

for(int i = 0; i <= n*(n-1)/2; i++)

{

if( dp[n][i] )

printf(i == 0 ? "%d" : " %d",i);

}

printf("\n");

}

return 0;

}

相关推荐

365bet亚洲版登陆首页 洛克王国五大灵石在哪获取 洛克王国五大灵石获取在哪里大全

洛克王国五大灵石在哪获取 洛克王国五大灵石获取在哪里大全

bt365博彩手机版 世界杯亚洲预选赛晋级规则全解析

世界杯亚洲预选赛晋级规则全解析

bt365博彩手机版 航天冰箱怎么样?怎么选购家用电冰箱?

航天冰箱怎么样?怎么选购家用电冰箱?