问 n n n 条折线最多能把平面分成几部分?
设
d
p
[
i
]
dp[i]
dp[i] 为
i
i
i 条折线的结果,则
d
p
[
1
]
=
2
,
d
p
[
2
]
=
7
dp[1]=2,dp[2]=7
dp[1]=2,dp[2]=7
当有 n − 1 n-1 n−1 条折线时,区域数为 d p [ n − 1 ] dp[n-1] dp[n−1],再加一条折线时,为了能够产生尽可能多的区域,折线的两边要和 n − 1 n-1 n−1 条折线的边,即 2 ( n − 1 ) 2(n-1) 2(n−1) 条线相交,能够产生 4 ( n − 1 ) 4(n-1) 4(n−1) 条线段和两条射线,每新增加一条线段或一条射线,就会将原来这部分平面一分为二,又因为折线角处形成的两条线段只能多产生一个面,所以要再减一,得递推公式:
d p [ i ] = d p [ i − 1 ] + 4 ( i − 1 ) + 2 − 1 = d p [ i − 1 ] + 4 i − 3 \begin{aligned} dp[i]&=dp[i-1]+4(i-1)+2-1\\ &=dp[i-1]+4i-3 \end{aligned} dp[i]=dp[i−1]+4(i−1)+2−1=dp[i−1]+4i−3
代码如下:
#include<iostream>
#include<cstdio>
//#define WINE
#define MAXN 10005
using namespace std;
typedef long long ll;
int T,n;
ll dp[MAXN]={0,2};
int main(){
#ifdef WINE
freopen("data.in","r",stdin);
#endif
for(int i=2;i<MAXN;i++)
dp[i]=dp[i-1]+4*i-3;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
printf("%lld\n",dp[n]);
}
return 0;
}