1. 程式人生 > >【遞推DP&技巧 hdu 2050 折線分割平面】

【遞推DP&技巧 hdu 2050 折線分割平面】

我們看到過很多直線分割平面的題目,今天的這個題目稍微有些變化,我們要求的是n條折線分割平面的最大數目。比如,一條折線可以將平面分成兩部分,兩條折線最多可以將平面分成7部分,具體如下所示。

Input
輸入資料的第一行是一個整數C,表示測試例項的個數,然後是C 行資料,每行包含一個整數n(0<n<=10000),表示折線的數量。
Output
對於每個測試例項,請輸出平面的最大分割數,每個例項的輸出佔一行。
Sample Input
2 1 2
Sample Output
2 7

::在一條直線得平面中去切割平面得圖形中有,增加第n條直線得時候,最多會和前面得n-1條直線都產生交集,這樣分割成得面得個數是f(n-1)+n,其實是f(n-1)+(n-1)+1(多加得+本身
用一條折線去切割同樣,在增加第n條時候會和前面得2*(n-1)條直線產生得交集,這個 第n條又是由2條直線交於一點構成得所以增加得點二點得個數為 2*(2(n-1))再加上其本身
那麼還可以擴充套件到每次用含有k個折線去切割一個平面 可以得到 f(n)=f(n-1)+k*k(n-1)+1
 

#include <bits/stdc++.h>
#include <iostream>
#define X 10005
#define inf 0x3f3f3f3f
#define PI 3.141592653589793238462643383
#define IO  ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int maxn = (int)1e5 + 10;
typedef long long ll;
ll f[10005];
int main()
{
    int t,n;
    f[1]=2;
    for(int i=2;i<=10000;++i)
        f[i]=f[i-1]+4*(i-1)+1;
    cin>>t;
    while(t--)
    {
        cin>>n;
        cout<<f[n]<<endl;
    }
    return 0;
}