解法
ふぇぇって考えてるとbitDPに帰着すると思う。
前処理で円と円の交差判定が必要で,
円Oと円O'間の距離が Oの半径 + O'の半径未満だったら交差してないと判定する。
距離はsqrtとらずに整数でやると誤差らずに出来て良かった。
ソース
#include<iostream>
#include<algorithm>
#include<map>
#include<cmath>
#include<algorithm>
using namespace std;
typedef pair < int , int > Pt;
bool dp[1 << 24];
Pt pts[24];
int n, r[24], c[24];
int hoge[24];
const int INF = 1 << 28;
bool intersect( Pt a, Pt b, int r1, int r2){
return pow( a.first - b.first, 2) + pow( a.second - b.second, 2) < pow( r1 + r2, 2);
}
int rec( int bit){
if(dp[bit]++) return -INF;
int ret = 0;
for(int i = 0 ; i < n ; i++ ){
if((bit >> i) & 1){
for(int j = i + 1 ; j < n ; j++ ){
if( (bit >> j) & 1 && c[i] == c[j] && !(bit & hoge[i]) && !(bit & hoge[j])){
ret = max( ret, rec( bit & ~(1 << i) & ~(1 << j)) + 2);
}
}
}
}
return ret;
}
int main()
{
while(cin >> n, n){
fill_n( dp, 1 << 24 , false);
fill_n( hoge, 24 , 0);
for(int i = 0 ; i < n ; i++ ){
cin >> pts[i].first >> pts[i].second >> r[i] >> c[i];
for(int j = 0 ; j < i ; j++ ){
if(intersect(pts[i],pts[j],r[i],r[j])) hoge[i] |= 1 << j;
}
}
cout << rec((1 << n) - 1) << endl;
}
}
0 件のコメント:
コメントを投稿