WA 50pts 求调
查看原帖
WA 50pts 求调
685964
shuqiang楼主2025/2/6 23:05
#include<iostream>
#include<string>

using namespace std;

const int N = 10, D = 210, M = 5e4 + 10;
int n, d, pow2[N], pow6[N], f[D][6][M], ans = -1;
string s;

int get(int x, int y){
	return x / pow6[y] % 6;
}

void merge(int ni, int nj, int lj, int nk, int w){
	for(int ii = 0; ii < n; ii++){
		if(get(nk, ii) == 0){
			int t = nk, cnt = 0, nw = w;
			t += nw * pow6[ii]; 
			if(ii != 0 && ii != n-1 && get(t, ii-1) == nw && get(t, ii+1) == nw){
				t -= nw * pow6[ii-1] + nw * pow6[ii] + nw * pow6[ii+1];
				cnt += pow2[nw] * 3; nw++;
				if(nw <= 5){
					t += nw * pow6[ii];
				}
			}
			if(ii != 0 && get(t, ii-1) == nw){
				t -= nw * pow6[ii-1] + nw * pow6[ii];
				cnt += pow2[nw] * 2; nw++;
				if(nw <= 5){
					t += nw * pow6[ii];
				}
			}
			if(ii != n-1 && get(t, ii+1) == nw){
				t -= nw * pow6[ii+1] + nw * pow6[ii];
				cnt += pow2[nw] * 2; nw++;
				if(nw <= 5){
					t += nw * pow6[ii];
				}
			}
			if(ii != 0 && get(t, ii-1) == nw){
				t -= nw * pow6[ii-1] + nw * pow6[ii];
				cnt += pow2[nw] * 2; nw++;
				if(nw <= 5){
					t += nw * pow6[ii];
				}
			}
//			cout << "  " << nj << ' ';
//			for(int iii = 0; iii < n; iii++) cout << get(t, iii) << ' ';
//			cout << '\n';
			f[ni+1][nj][t] = max(f[ni+1][nj][t], f[ni][lj][nk] + cnt);
			if(ni == d*2-1) ans = max(ans, f[ni][lj][nk] + cnt);
		}
	}
}

int main(){
	cin >> n >> d >> s;
	pow6[0] = 1;
	for(int i = 1; i <= n; i++) pow6[i] = pow6[i-1] * 6;
	pow2[0] = 1;
	for(int i = 1; i <= 5; i++) pow2[i] = pow2[i-1] * 2;
	for(int i = 0; i < D; i++){
		for(int j = 0; j < 6; j++){
			for(int k = 0; k < M; k++) f[i][j][k] = -1;
		}
	}
	f[0][0][0] = 0;
	for(int i = 0; i < d*2; i++){
		for(int j = 0; j < 6; j++){
			for(int k = 0; k < pow6[n]-1; k++){
				if(i & 1){
					if(f[i][j][k] != -1){
						f[i+1][j][k] = f[i][j][k];
						if(j != 0) merge(i, 0, j, k, j);
					}
				}
				else{
					if(f[i][j][k] != -1){
//		  				cout << i << ' ' << j << ' ';
//		  				for(int ii = 0; ii < n; ii++) cout << get(k, ii) << ' ';
//		  				cout << f[i][j][k] << '\n';
						int w = s[i/2] - '0';
						if(j == 0){
							f[i+1][w][k] = max(f[i+1][w][k], f[i][j][k]);
							if(i == d-1) ans = max(ans, f[i][j][k]);
						}
						merge(i, j, j, k, w);
					}
				}
				
			}
		}
	}
	cout << ans;
	return 0;
}
2025/2/6 23:05
加载中...