一件奇怪的事情
查看原帖
一件奇怪的事情
543983
安静狂饼干楼主2023/3/31 13:03

优化全部的时候 WA 和 TLE 了,有两个地方没有优化,过了?

//完全的优化
#include<bits/stdc++.h>

using namespace std;

int t,n;
string s;

map<string ,int> f;

int dfs(string s){
	if(f[s]!=0) return f[s]-2;
	if(s.find("LOL")!=-1){
		f[s]=1;
		return -1;
	}
	if(s.find("L*L")!=-1){
		f[s]=3;
		return 1;
	}
	if(s.find("*OL")!=-1){
		f[s]=3;
		return 1;
	}
	if(s.find("LO*")!=-1){
		f[s]=3;
		return 1;
	}
	if(s.find("*")==-1){
		f[s]=2;
		return 0;
	}
	int maxn=-2;
	for(int i=0;i<n;++i){
		if(s[i]=='*'){
			s[i]='L';
			maxn=max(maxn,-dfs(s));
			if(maxn==1) {
				f[s]=3;
				return 1;
			}
			s[i]='O';
			maxn=max(maxn,-dfs(s));
			if(maxn==1) {
				f[s]=3;
				return 1;
			}
			s[i]='*';
		}
	}
	f[s]=maxn+2;
	return maxn;
}

int main(){
	cin>>t;
	while(t--){
		cin>>s;
		n=s.size();
		cout<<dfs(s)<<endl;
	}
	return 0;
}

GG

//不那么完全的优化
#include<bits/stdc++.h>

using namespace std;

int t,n;
string s;

map<string ,int> f;

int dfs(string s){
	if(f[s]!=0) return f[s]-2;
	if(s.find("LOL")!=-1){
		f[s]=1;
		return -1;
	}
	if(s.find("L*L")!=-1){
		f[s]=3;
		return 1;
	}
	if(s.find("*OL")!=-1){
		f[s]=3;
		return 1;
	}
	if(s.find("LO*")!=-1){
		f[s]=3;
		return 1;
	}
	if(s.find("*")==-1){
		f[s]=2;
		return 0;
	}
	int maxn=-2;
	for(int i=0;i<n;++i){
		if(s[i]=='*'){
			s[i]='L';
			maxn=max(maxn,-dfs(s));
			if(maxn==1) {
				//f[s]=3;
				return 1;
			}
			s[i]='O';
			maxn=max(maxn,-dfs(s));
			if(maxn==1) {
				//f[s]=3;
				return 1;
			}
			s[i]='*';
		}
	}
	f[s]=maxn+2;
	return maxn;
}

int main(){
	cin>>t;
	while(t--){
		cin>>s;
		n=s.size();
		cout<<dfs(s)<<endl;
	}
	return 0;
}

A了?

2023/3/31 13:03
加载中...