Problem:
Problem C: Unhappy Class
Problem
山之御船学園の1年G組は、不幸を背負った女子生徒たちが集まるクラスである。  彼女たちは、幸福になることを目標に、日々様々な試練に立ち向かう。
彼女たちのクラスでは、幸福になるための試練の一環として、幸福実技科目を受講することができる。
月曜から金曜のそれぞれ1限から
N
限までに授業科目の枠があり、
M
個の受講可能な科目がある。
科目
i
は、曜日
d
i
(
d
i
= 0, 1, 2, 3, 4がそれぞれ、月曜、火曜、水曜、木曜、金曜に対応する)の
a
i
限目から始まり、連続する
k
i
コマで行われ、それを受講したときに得られる幸福度は
t
i
である。
各生徒は、最大
L
個の科目を互いに重ならないように自由に選ぶことができる。どのように科目を選べば、最も高い幸福度を得られるだろうか。与えられた科目の情報から、得られる幸福度の最大値を求めてほしい。
Input
入力は以下の形式で与えられる。
N
M
L
d
1
a
1
k
1
t
1
d
2
a
2
k
2
t
2
...
d
M
a
M
k
M
t
M
1行目に3つの整数
N
,
M
,
L
が空白区切りで与えられる。
2行目から
M
+1行目に4つの整数
d
i
,
a
i
,
k
i
,
t
i
が空白区切りで与えられる。
Constraints
2 ≤
N
≤ 8
0 ≤
M
≤ 300
0 ≤
L
≤ min(
N
×5,
M
)
0 ≤
d
i
≤ 4
1 ≤
a
i
≤
N
1 ≤
k
i
a
i
+
k
i
- 1 ≤
N
1 ≤
t
i
≤ 100
Output
幸福度の和の最大値を1行に出力せよ。
Sample Input 1
3 7 3
0 1 1 1
0 1 1 2
1 1 3 4
1 1 1 1
1 2 1 2
2 1 1 3
2 2 2 1
Sample Output 1
9
Sample Input 2
5 10 5
0 1 1 2
0 2 1 2
0 1 2 3
1 2 1 2
1 4 2 3
2 1 1 1
2 1 1 2
3 3 2 3
4 1 1 2
4 2 1 2
Sample Output 2
13

Submitted solutions:

code_snippet: #include <iostream>
#include <vector>
#include <array>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <tuple>
#include <bitset>
#include <memory>
#include <cmath>
#include <algorithm>
#include <functional>
#include <iomanip>
#include <numeric>
#include <climits>
#include <cfloat>
struct Class {
	int length, satisfaction;
};
std::vector<int> cal_max_schedule(const int sec, const std::vector<std::vector<Class>>& classes, std::vector<std::vector<int>>memo) {
	if (sec == classes.size()) return std::vector<int>(classes.size() + 1, 0);
	if (!memo[sec].empty()) return memo[sec];
	memo[sec] = cal_max_schedule(sec + 1, classes, memo);
	for (const auto& c : classes[sec]) {
		auto next = cal_max_schedule(sec + c.length, classes, memo);
		for (auto i = 1; i < next.size(); ++i) {
			memo[sec][i] = std::max(memo[sec][i], next[i - 1] + c.satisfaction);
		}
	}
	return memo[sec];
}
std::vector<int> cal_one_day_schedule(const std::vector<std::vector<Class>>& classes) {
	return cal_max_schedule(0, classes, std::vector<std::vector<int>>(classes.size()));
}
int main() {
	int n, m, l; std::cin >> n >> m >> l;
	std::vector<std::vector<std::vector<Class>>> classes(5, std::vector<std::vector<Class>>(n));
	for (auto i = 0; i < m; ++i) {
		int d, a; std::cin >> d >> a;
		Class c; std::cin >> c.length >> c.satisfaction;
		classes[d][a - 1].push_back(c);
	}
	std::vector<int> max(l + 1, 0);
	for (const auto& c : classes) {
		auto m = cal_one_day_schedule(c);
		for (int i = l; i >= 0; --i) {
			for (auto j = 0; j < m.size() && i + j < max.size(); ++j) {
				max[i + j] = std::max(max[i + j], max[i] + m[j]);
			}
		}
	}
	std::cout << *std::max_element(max.begin(), max.end()) << std::endl;
}
accuracy: 1
time_ms: 60
memory_kb: 3180
final_rank: 3

code_snippet: #include<bits/stdc++.h>
using namespace std;
 
#define int long long
#define pb push_back 
#define pf push_front 
#define mp make_pair
#define fr first
#define sc second
#define Rep(i, n) for ( int i = 0 ; i < (n); i++ )
#define All(v) v.begin(), v.end()
 
typedef pair<int, int> Pii; typedef pair<int, Pii> Pip;
const int INF = 1107110711071107;
 
int N, M, L;
int dp[6][300][41][1 << 9];
 
struct S {
  int a, k, t;
  S(int a_, int k_, int t_) {
    a = a_; k = k_; t = t_;
  }
};
 
vector<S> D[5];
 
int dfs(int d, int n, int l, int bit) {
  //cout << d << " " << n << " " << l << " " << bit << endl;;
  if ( d == 5 || l == 0 ) return 0;
  if ( D[d].size() == n ) return dfs(d+1, 0, l, 0);
  if ( dp[d][n][l][bit] ) return dp[d][n][l][bit];
 
  int ret = dfs(d, n+1, l, bit);
  int a = D[d][n].a, k = D[d][n].k, t = D[d][n].t;
  bool flag = true;
  for ( int i = a; i < a+k; i++ ) {
    if ( bit & (1 << i) ) {
      flag = false;
      break;
    }
  }
   
  if ( flag ) {
    int nbit = bit;
    for ( int i = a; i < a+k; i++ ) {
      nbit |= (1 << i);   
    }
    ret = max(ret, dfs(d, n+1, l-1, nbit) + t);
  }
 
  return dp[d][n][l][bit] = ret;
}
 
 
signed main() {
  cin >> N >> M >> L;
 
  Rep(i, M) {
    int d, a, k, t;
    cin >> d >> a >> k >> t;
    a--;
    D[d].pb(S(a, k, t));
  }
  //cout << endl;
  cout << dfs(0, 0, L, 0) << endl;
}
accuracy: 1
time_ms: 20
memory_kb: 28948
final_rank: 4

code_snippet: #include<bits/stdc++.h>
using namespace std;

#define int long long
#define pb push_back 
#define pf push_front 
#define mp make_pair
#define fr first
#define sc second
#define Rep(i, n) for ( int i = 0 ; i < (n); i++ )
#define All(v) v.begin(), v.end()

typedef pair<int, int> Pii; typedef pair<int, Pii> Pip;
const int INF = 1107110711071107;

int N, M, L;
int dp[6][300][41][1 << 9];

struct S {
  int a, k, t;
  S(int a_, int k_, int t_) {
    a = a_; k = k_; t = t_;
  }
};

vector<S> D[5];

int dfs(int d, int n, int l, int bit) {
  //cout << d << " " << n << " " << l << " " << bit << endl;;
  if ( d == 5 || l == 0 ) return 0;
  if ( D[d].size() == n ) return dfs(d+1, 0, l, 0);
  if ( dp[d][n][l][bit] ) return dp[d][n][l][bit];

  int ret = dfs(d, n+1, l, bit);
  int a = D[d][n].a, k = D[d][n].k, t = D[d][n].t;
  bool flag = true;
  for ( int i = a; i < a+k; i++ ) {
    if ( bit & (1 << i) ) {
      flag = false;
      break;
    }
  }
  
  if ( flag ) {
    int nbit = bit;
    for ( int i = a; i < a+k; i++ ) {
      nbit |= (1 << i);	
    }
    ret = max(ret, dfs(d, n+1, l-1, nbit) + t);
  }

  return dp[d][n][l][bit] = ret;
}


signed main() {
  cin >> N >> M >> L;

  Rep(i, M) {
    int d, a, k, t;
    cin >> d >> a >> k >> t;
    a--;
    D[d].pb(S(a, k, t));
  }
  //cout << endl;
  cout << dfs(0, 0, L, 0) << endl;
}
accuracy: 1
time_ms: 20
memory_kb: 28992
final_rank: 5

code_snippet: #include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
typedef pair<int,int> P;
typedef pair<int,P> PP;

int dp[5][1<<8][301],dp2[6][301],d[5][301];
int main() {
  int n,m,l;
  cin >> n >> m >> l;
  vector<PP> a[5];
  for(int i=0,x,y,z,w; i<m; i++) {
    cin >> x >> y >> z >> w;
    a[x].push_back(PP(y-1,P(z,w)));
  }
  for(int s=0; s<5; s++) {
    for(int t=0; t<(1<<n); t++) {
      for(int k=0; k<a[s].size(); k++) {
        for(int i=0; i<a[s].size(); i++) {
          int c=0;
          for(int j=a[s][i].F; j<a[s][i].F+a[s][i].S.F; j++) c|=t&(1<<j);
          if(c) continue;
          int tt=t;
          for(int j=a[s][i].F; j<a[s][i].F+a[s][i].S.F; j++) tt|=1<<j;
          dp[s][tt][k+1]=max(dp[s][tt][k+1],dp[s][t][k]+a[s][i].S.S);
        }
      }
    }
  }
  for(int i=0; i<5; i++) {
    for(int t=0; t<(1<<n); t++) {
      for(int j=0; j<=a[i].size(); j++) d[i][j]=max(d[i][j],dp[i][t][j]);
    }
  }
  for(int i=0; i<5; i++) {
    for(int k=0; k<=m; k++) {
      for(int j=0; j<=a[i].size(); j++) {
        if(k+j<301) dp2[i+1][k+j]=max(dp2[i+1][k+j],dp2[i][k]+d[i][j]);
      }
    }
  }
  int ans=0;
  for(int i=0; i<=l; i++) ans=max(ans,dp2[5][i]);
  cout << ans << endl;
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 4592
final_rank: 2

code_snippet: #include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <sstream>
#include <string>
#include <complex>
#include <cstdio>
using namespace std;

int dp2[6][310] = {};

int item[5][256];
int main(){
	int N,M,L;
	cin >> N >> M >> L;
	
	for(int i = 0 ; i < M ; i++){
		int d,a,k,t;
		cin >> d >> a >> k >> t;
		--a;
		int x = (1<<k) - 1;
		x = x << a;
		item[d][x] = max(item[d][x],t);
	}
	int ans = 0;
	for(int i = 0 ; i < 5 ; i++){
		int dp[256][300] = {};
		
		for(int j = 0 ; j < 256 ; j++){
			for(int k = 0 ; k < 256 ; k++){
				if( j & k ) continue;
				for(int l = 0 ; l <= 256 ; l++){
				 	dp[j|k][l+1] = max(dp[j|k][l+1],dp[k][l] + item[i][j]);
				}
			}
		}
		int s[310] = {};
		
		for(int l = 0 ; l <= 300 ; l++)
			for(int j = 0 ; j < 256 ; j++)
				s[l] = max(s[l],dp[j][l]);

		for(int l = 0 ; l <= 300 ; l++){
			for(int j = 0 ; j < 300 ; j++){
				if( l + j <= 300 ){
					dp2[i+1][l+j] = max(dp2[i+1][l+j], dp2[i][j] + s[l]);
				} 
			}
		}

	}
	cout << dp2[5][L] << endl;
}
accuracy: 1
time_ms: 10
memory_kb: 3388
final_rank: 1