來自杭電ppt上面的一道題目。
n條直線互不平行且無三線共點的最多交點數max=1+2+……(n-1)=n(n-1)/2,
所以n=20的話,最大的交點數是190
本題是求有多少種交點數:
容易列舉出n=1,2,3的情況:
00,1
0,2,3
如果已知 無交點;
2、第四條與其中兩條平行,交點數為(n-1)*1+0=3;
3、第四條與其中一條平行,這兩條平行直線和另外兩點直線的交點數為(n-2)*2=4,而另外兩條直線既可能平行也可能相交,因此可能交點數為:
(n-2)*2+0=4
或者(n-2)*2+1=5
4、 第四條直線不與任何一條直線平行,交點數為:
(n-3)*3+0=3
或者(n-3)*3+2=5 或者 (n-3)*3+3=6
即n=4時,有0個,3個,4個,5個,6個不同交點數。
從上述n=4的分析過程中,我們發現:
m條直線的交點方案數
=(m-r)條平行線與r條直線交叉的交點數+ r條直線本身的交點方案
=(m-r)*r+r條之間本身的交點方案數(1<=r<=m)
以上分析摘自ppt。
可以得出狀態轉移方程(m-r)*r + r條之間本身的交點方案數(1<=r<=m)
dp需儲存已解決的子問題的答案,在需要時再找出已求的答案。
一般步驟:
1.找出最優解特徵,並刻畫出結構特徵
2.遞迴定義出其最優值
3.以自底向上的方式計算出其最優值
4.根據計算最優值得到的資訊,構造最優解。
如本題,可設個2維陣列dp[21][200]來記錄結點情況。
當r條直線有j個結點時,dp[i][(m-r)*r+j]可以表示i條直線情況。
#include #include using namespace std;
const int n = 200;
int dp[25][n];
int main()
for(int n = 2; n <= 20; n++)
}} }
int n;
while(scanf("%d",&n) != eof)
} printf("\n");
} return 0;
}
hdu 1466 計算直線的交點數
include intmain return0 一 n條直線把空間分成幾部分 現在說地是空間了,不是平面了,要注意!我們來討論一下吧 點分線 0維分1維 c n,1 c n,0 線分面 1維分2維 c n,2 c n,1 c n,0 麵分空間 2維分3維 c n,3 c n,2 c n,1 c n,...
hdu 1466 計算直線的交點數
平面上有n條直線,且無三線共點,問這些直線能有多少種不同交點數。比如,如果n 2,則可能的交點數量為0 平行 或者1 不平行 input 輸入資料報含多個測試例項,每個測試例項佔一行,每行包含乙個正整數n n 20 n表示直線的數量.output 每個測試例項對應一行輸出,從小到大列出所有相交方案,...
HDU1466 計算直線的交點數
1 n條直線互不平行且無三線共點的最多交點數max 1 2 n 1 n n 1 2 2 一般統計的方法 假設一共有n a b條直線 即n條直線分成2組,分別為a條和b條 則 總的交點數 a內的交點數 b內的交點數 a,b之間的交點數 3 我們來分析加入第n條直線的情況 這裡以n 4為例 分類方法 和...