关于这题的初始化
  • 板块CF132C Logo Turtle
  • 楼主D2T1xubiaoshi
  • 当前回复10
  • 已保存回复10
  • 发布时间2022/6/20 14:20
  • 上次更新2023/10/27 22:56:24
查看原帖
关于这题的初始化
390770
D2T1xubiaoshi楼主2022/6/20 14:20
//CF132C
#include <algorithm>
#include <cstring>
#include <cstdio>

const int N = 105;
int n, m, f[N][N*2][N][2]; 
char s[N];

int main(){
	scanf("%s%d", s+1, &m);
	n = strlen(s+1);
	//*******
	f[0][N][0][0] = f[0][N][0][1] = 1;
	//*******
	for(int i = 1; i <= n; ++ i){
		for(int j = 1; j < N*2-1; ++ j){
			for(int k = 0; k <= m; ++ k){
				if(s[i] == 'T'){
					f[i][j][k][0] |= f[i-1][j][k][1];
					f[i][j][k][1] |= f[i-1][j][k][0];
					if(k){
						f[i][j][k][0] |= f[i-1][j-1][k-1][0];
						f[i][j][k][1] |= f[i-1][j+1][k-1][1];
					}
				} else {
					f[i][j][k][0] |= f[i-1][j-1][k][0];
					f[i][j][k][1] |= f[i-1][j+1][k][1];
					if(k){
						f[i][j][k][0] |= f[i-1][j][k-1][1];
						f[i][j][k][1] |= f[i-1][j][k-1][0];
					}
				}
			}
		}
	}
	int ans = 0;
	for(int i = 1; i < N*2-1; ++ i){
		for(int j = m; j >= 0; j -= 2){
			if(f[n][i][j][0] || f[n][i][j][1]){
				ans = std::max(ans, i-N);
			}
		}
	}
	printf("%d\n", ans);
	return 0;
}

fi,j,k,lf_{i,j,k,l} 表示第 ii 步走到 jNj-N 处,改变了 kk 个步骤,方向为 ll 是否可行。

用星号框起来的那行,为什么要把初始的时候朝着两个方向都设为可行?两个方向不应该是对称的吗?应该只用考虑一个方向就行了啊?


只初始化一个方向,错误数据:

Input

TFFTFTTTFFTFTFTTTFFTTFFTFTFFTFFFFTTTTTFTFTFTTFFTTFTFFTTFTFFTTTTFFTFTTTFTTTTFFFFTFFTFFTFFFFTTTT
2

Output

13

Answer

19

然后我打了个暴力

#include <cstdio>
#include <cstring>

char s[100], t[100];
int main(){ int ans = 0;
	scanf("%s", s+1);
	int n = strlen(s+1);
	for(int i = 1; i <= n; ++ i){
		for(int j = i+1; j <= n; ++ j){	
			memcpy(t, s, sizeof(s));
			if(t[i] == 'F') t[i] = 'T';
			if(t[i] == 'T') t[i] = 'F';
			if(t[j] == 'F') t[j] = 'T';
			if(t[j] == 'T') t[j] = 'F';
			int pos = 0, to = 1;
			for(int i = 1; i <= n; ++ i){
				if(t[i] == 'T') to *= -1;
				else pos += to;
			}
			if(pos > ans) ans = pos;
		}
	}
	printf("%d\n", ans);
}

发现确实答案应该是 13,这是为什么?

2022/6/20 14:20
加载中...