题目:http://acm.hdu.edu.cn/showproblem.php?pid=1290
思路:先在草稿纸上画,找规律。
规律:
a[n],b[n],c[n],分别代表一条直线分成的段数,二维的块数,三位的块数。
先考虑二维(直线)的情况,n个点把直线分成的份数a[n]=n+1。二维(平面)的情况,考虑n条直线把一个平面分成的份数最多(表示为b[n])时,第k条直线应该与前k-1条直线相交于不同的k-1个点,这k-1个点将第k条直线分成a[k-1]部分,每一部分会把所在的平面分成两份,所以有b[n]=b[n-1]+a[n-1]。
同理三维情况c[n]=c[n-1]+b[n-1]。(每次要最大,我们都希望与每块都相交。
Code:
#include <cstdio> #include<iostream> using namespace std; int main() { int b[1002],c[1002]; int i,n; while(cin>>n&&n>0) { b[1]=c[1]=2; for(i=2;i<=1005;i++) { b[i]=b[i-1]+i; c[i]=c[i-1]+b[i-1]; } cout<<c[n]<<endl; } return 0; }