HDU-2050-折线分割平面
我在写小白dp的时候遇到这样的数学问题。总结了三种类型=-=数学不是很好。。。
这是一道递推题
题目问的是折线,这些也是直线的变形
1.考虑单条直线分割情况

0条直线一个平面,一条直线两个平面,两条直线四个平面,三条直线7个平面,我们可以发现只有新增加的第n条直线与前n-1条直线相交时可以获得最大的平面数量,第n条直线与前n-1条之间相交会产生n-1个交点,n-1个交点会产生n个新的平面。所以n条直线最多产生平面的式子是:
1+1+2+3+4+…+n = (n^2 + n + 2) / 2;
2.考虑平行线的情况

没有平行线的时候是一个平面,有一组平行线的时候是3个平面,两组9个平面,三组19个平面。
推导是这样的:
当第n组平行线加进去的时候,前面已经有2*(n-1)条直线,第n组平行线加进去分别产生相同个数的新交点,都是2*(n-1),然后都分别都新产生了相同个数的平面个数都是2*(n-1)+1,所以第n组平行线加进去产生新平面的个数是4n - 2
所以总平面的个数是:
1+ 41-2 + 42-2 + … + 4 * n - 2 = 2n^2 + 1
3.考虑折线的情况


我们很容易看出一条折线是由一组平行线结合成一条线而成,而每组平行线结合成一条直线,相应的平面个数都会减少一个。
当n组平行线相结合时,我们会减少n个平面。
所以n条折线的平面个数就是:
2*n - n + 1
这就是我们的式子啦~
这样子推下来代码部分就很简单啦~
代码部分~
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
typedef long long ll;
ll dp[N];
int main()
{
int t;
cin >> t;
for (int i = 1; i <= N; i++)
{
dp[i] = 2 * i * i - i + 1;
}
while (t--)
{
int n;
cin >> n;
cout << dp[n] << endl;
}
return 0;
}


252

被折叠的 条评论
为什么被折叠?



