【遞推DP&技巧 hdu 2050 折線分割平面】
阿新 • • 發佈:2018-12-01
我們看到過很多直線分割平面的題目,今天的這個題目稍微有些變化,我們要求的是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; }