arrows blog

解いた問題などを適当に書いていきます。

AOJ 2321 - Butterfly

問題概要

Claireという女性がいる。彼女がN人の男性のうちの何人かとデートをするプランを立てることを考える。N人の男性にはそれぞれM個のデートをする時間帯(SからE)とその男性とデートしたときの満足度Lが与えられる。彼女は各男性に対して、全ての時間帯でデートができるのであればその男性とデートし満足度が得られる。この満足度を最大化せよ。時間帯が重なるとデートはできない。

制約

  • 1 ≤ N ≤ 100
  • 1 ≤ M ≤ 16
  • 1 ≤ L ≤ 100000000
  • 6 ≤ S < E ≤ 22

解法

時間が6から22であり16区間なのでそれをbitで考えてbitDPする。
dp[i][j] := i人目までで時間帯のビットjを使用したときの最大の満足度

コード

#include <bits/stdc++.h>
 
using namespace std;
 
#define MAX 110
typedef long long ll;
 
int N,M;
ll dp[MAX][1<<16],L[MAX];
int bit[MAX];
 
ll solve(int n,int S){
  if(n == N){ return 0LL; }
  if(dp[n][S] != -1){
    return dp[n][S];
  }
  ll res = 0LL;
  res = max(res,solve(n+1,S));
  bool ok = true;
  for(int i = 0 ; i < 16 ; i++){
    if((S >> i) & (bit[n] >> i)){
      ok = false;
      break;
    }
  }
  if(ok){
    res = max(res,solve(n+1,S|bit[n])+L[n]);
  }
  return dp[n][S] = res;
}
 
int main(){
  int S,E;
  while(cin >> N, N){
    memset(dp,-1,sizeof(dp));
    for(int i = 0 ; i < N ; i++){
      cin >> M >> L[i]; bit[i] = 0;
      for(int j = 0 ; j < M ; j++){
        cin >> S >> E;
        S -= 6; E -= 6;
        for(int k = S ; k < E ; k++){
          bit[i] |= (1<<k);
        }
      }
    }
    cout << solve(0,0) << endl;
  }
  return 0;
}