WA 10pts求调
查看原帖
WA 10pts求调
685964
shuqiang楼主2025/2/5 22:39
#include<iostream>
#include<string>

using namespace std;

const int N = 10, D = 110, 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;
}

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; i++){
		for(int j = 0; j < 6; j++){
			for(int k = 0; k < pow6[n]-1; k++){
				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] - '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]);
					}
					for(int ii = 0; ii < n; ii++){
						if(get(k, ii) == 0){
							int t = k, cnt = 0; w = s[i] - '0';
							t += w * pow6[ii]; 
							if(ii != 0 && ii != n-1 && get(t, ii-1) == w && get(t, ii+1) == w){
								t -= w * pow6[ii-1] + w * pow6[ii] + w * pow6[ii+1]; w++;
								if(w <= 5){
									t += w * pow6[ii];
								}
								cnt += pow2[w-1] * 3;
							}
							if(ii != 0 && get(t, ii-1) == w){
								t -= w * pow6[ii-1] + w * pow6[ii]; w++;
								if(w <= 5){
									t += w * pow6[ii];
								}
								cnt += pow2[w-1] * 2;
							}
							if(ii != n-1 && get(t, ii+1) == w){
								t -= w * pow6[ii+1] + w * pow6[ii]; w++;
								if(w <= 5){
									t += w * pow6[ii];
								}
								cnt += pow2[w-1] * 2;
							}
							if(ii != 0 && get(t, ii-1) == w){
								t -= w * pow6[ii-1] + w * pow6[ii]; w++;
								if(w <= 5){
									t += w * pow6[ii];
								}
								cnt += pow2[w-1] * 2;
							}
							f[i+1][j][t] = max(f[i+1][j][t], f[i][j][k] + cnt);
							if(i == d-1) ans = max(ans, f[i][j][k] + cnt);
						}
					}
					if(j != 0){
						for(int ii = 0; ii < n; ii++){
							if(get(k, ii) == 0){
								int t = k, cnt = 0; w = j;
								t += w * pow6[ii]; 
								if(ii != 0 && ii != n-1 && get(t, ii-1) == w && get(t, ii+1) == w){
									t -= w * pow6[ii-1] + w * pow6[ii] + w * pow6[ii+1]; w++;
									if(w <= 5){
										t += w * pow6[ii];
									}
									cnt += pow2[w-1] * 3;
								}
								if(ii != 0 && get(t, ii-1) == w){
									t -= w * pow6[ii-1] + w * pow6[ii]; w++;
									if(w <= 5){
										t += w * pow6[ii];
									}
									cnt += pow2[w-1] * 2;
								}
								if(ii != n-1 && get(t, ii+1) == w){
									t -= w * pow6[ii+1] + w * pow6[ii]; w++;
									if(w <= 5){
										t += w * pow6[ii];
									}
									cnt += pow2[w-1] * 2;
								}
								if(ii != 0 && get(t, ii-1) == w){
									t -= w * pow6[ii-1] + w * pow6[ii]; w++;
									if(w <= 5){
										t += w * pow6[ii];
									}
									cnt += pow2[w-1] * 2;
								}
								f[i+1][0][t] = max(f[i+1][0][t], f[i][j][k] + cnt);
								if(i == d-1) ans = max(ans, f[i][j][k] + cnt);
							}
						}
					}
				}
			}
		}
	}
	cout << ans;
	return 0;
}
2025/2/5 22:39
加载中...