AOJ 0503

じりきで解けなかった。
漸化式作るのむずかしすぎ(頭悪い)

#include <cstdio>
#include <algorithm>
using namespace std;

const int MAX_N = 15;
int N, M;
int cup[MAX_N];

int main(){
	while(scanf("%d %d",&N,&M)&&N!=0){
		for(int i=0; i<3; i++){
			int K;
			scanf("%d", &K);
			for(int j=0; j<K;j++){
				int t;
				scanf("%d", &t);
				cup[t-1] = i;
			}
		}
		int A[N], C[N], X[N];
		X[N-1] = 2;
		A[N-1] = cup[N-1];
		C[N-1] = 2-cup[N-1];
		for(int n=N-1; n>0; n--){
			X[n-1] = 3*X[n] + 2;
			switch(cup[n-1]){
				case 0:
					A[n-1] = A[n];
					C[n-1] = C[n] + 2 * X[n] + 2;
					break;
				case 1:
					A[n-1] = C[n] + X[n] + 1;
					C[n-1] = A[n] + X[n] + 1;
					break;
				case 2:
					A[n-1] = A[n] + 2 * X[n] + 2;
					C[n-1] = C[n];
					break;
			}
		}
		int ans = min(A[0], C[0]);
		ans = (M < ans)?-1:ans;
		printf("%d\n", ans);
	}
	return 0;
}