JAG 模擬地区予選 2011 B問題

解法

BitDP

実装(C++)

A問題よりも実装時間が短かった気がする.

#include <algorithm>
#include <vector>
#include <iostream>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <iomanip>
#include <functional>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iterator>
#include <sstream>
#include <tr1/unordered_map>
using namespace std;
using namespace tr1;
#define REP(i,x) for(int i=0;i<(int)x;i++)
#define FOR(it,x) for(__typeof(x.begin()) it=x.begin();it!=x;it++)
int N;
struct Guy{
        int M,L;
        vector<int> S,E;
        int state;
};
Guy guys[100];
bool input(){
        cin>>N;
        if(N==0)return false;
        for(int i=0;i<N;i++){
                int M,L;
                cin>>M>>L;
                guys[i]=Guy();
                guys[i].M=M;
                guys[i].L=L;
                guys[i].state=0;
                guys[i].S=vector<int>();
                guys[i].E=vector<int>();

                REP(j,M){
                        int s,e;
                        cin>>s>>e;
                        guys[i].S.push_back(s);
                        guys[i].E.push_back(s);
                        for(int k=s;k<e;k++){
                                guys[i].state|=1<<k;
                        }
                }
        }
        return true;
}
unordered_map<int,long long> res[100];
long long solve(int k,int state){
        if(k==N){
                return 0;
        }
        if(res[k].find(state)!=res[k].end())return res[k][state];
        long long ans=solve(k+1,state);
        //state=0
        //使う
        if((state&guys[k].state)==0){
                ans=max(ans,solve(k+1,state|guys[k].state)+guys[k].L);
        }
        return res[k][state]=ans;
}
int main() {
        while(input()){
                REP(i,100){
                        res[i].clear();
                }
                cout<<solve(0,0)<<endl;
        }
        return 0;
}