Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef struct{
- int x;
- int y;
- int z;
- }box;
- vector<box> g;
- int dp[13][(1<<13)+5][3];
- void reseta(int lim){
- for(int i=0;i<13;i++){
- for(int j=0;j<(1<<13)+5;j++){
- for(int k=0;k<3;k++){
- dp[i][j][k] = -1;
- }
- }
- }
- }
- bool isvalid(int u,int l1,int v,int l2){
- u--;
- v--;
- if(u == -1) return true;
- int a,b;
- int c,d;
- if(l1 == 0){
- a = g[u].x;
- b = g[u].y;
- }
- else if(l1 == 1){
- a = g[u].x;
- b = g[u].z;
- }
- else{
- a = g[u].y;
- b = g[u].z;
- }
- if(l2 == 0){
- c = g[v].x;
- d = g[v].y;
- }
- else if(l2 == 1){
- c = g[v].x;
- d = g[v].z;
- }
- else{
- c = g[v].y;
- d = g[v].z;
- }
- if(c <= a && d <= b) return true;
- if(c <= b && d <= a) return true;
- return false;
- }
- int solve(int last,int bmask,int pos,int n){
- if(bmask == 0) return 0;
- if(dp[last][bmask][pos] != -1) return dp[last][bmask][pos];
- int maxi = 0;
- for(int i=1;i<=n;i++){
- if((bmask&(1<<i))){
- for(int j=0;j<3;j++){
- if(isvalid(last,pos,i,j)){
- bmask = bmask^(1<<i);
- maxi = max(maxi,1+solve(i,bmask,j,n));
- bmask = bmask|(1<<i);
- }
- }
- }
- }
- dp[last][bmask][pos] = maxi;
- return (maxi);
- }
- int main(){
- ios::sync_with_stdio(0);
- cin.tie(0);
- int n;
- int xx=1;
- cin >> n;
- while(n != 0){
- box aux;
- reseta(n+1);
- g.clear();
- for(int i=0;i<n;i++){
- cin >> aux.x >> aux.y >> aux.z;
- g.push_back(aux);
- }
- int bmask = 0;
- for(int i=1;i<=n;i++){
- bmask = bmask|(1<<i);
- }
- cout << "Case " << xx++ << ": ";
- cout << solve(0,bmask,0,n) << endl;
- cin >> n;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement