hdu 1466、結題報告


Problem Description
平面の上でn本の直線があって、しかも3線の共点がなくて、これらの直線に何種類の異なる交差点があることができるかを聞きます.
例えば、n=2の場合、可能な交点数は0(平行)または1(非平行)である.
 
Input
入力データは複数の試験例を含み、各試験例は1行を占め、各行は正の整数n(n<=20)を含み、nは直線の数を表す.
 
Output
各テストインスタンスは1行の出力に対応し、各数が可能な交差点数であり、各行の整数間にスペースで区切られたすべての交差スキームを小さいから大きいまでリストします.
 
Sample Input

   
   
   
   
2 3

 
Sample Output

   
   
   
   
0 1 0 2 3

DP、
N番目の線を加えると、他のn-1本を2つのグループに分けます.グループa:n番目の平行グループb:平行ではありません.
合計交差点数はa内交差点数b内交差点数aとbの間の交差点数、
コードは次のとおりです.
#include <iostream>
#include <set>
using namespace std;
int main()
{
    int n,tmp;
    set<int> s[21];
    s[0].insert(0);
    s[1].insert(0);
    for(int i=2;i<21;i++)
    {
        for(int j=0;j<i;j++)
        {
            set<int>::iterator it;
            for(it=s[j].begin();it!=s[j].end();it++)
            {
                tmp=*it+(i-j)*j;
                s[i].insert(tmp);
            }
        }
    }
    while(cin>>n)
    {
        set<int>::iterator it;
        for(it=s[n].begin();it!=s[n].end();it++)
        {
            if(it!=s[n].begin()) cout<<" ";
            cout<<*it;
        }
        cout<<endl;
    }
}

新学のset,set内の要素は唯一で、自動的にソートして、重い判断を省きます.