额,第一个点MLE,然后其余点RE???啥情况?
查看原帖
额,第一个点MLE,然后其余点RE???啥情况?
658786
STUDENT00楼主2023/1/10 15:24

代码如下:

#include<bits/stdc++.h>
#define N 205
using namespace std;
int num[4],dp[N][N][4],n;
vector<int> t[4][4];
char str[N],o[]={'W','I','N','G'};
int f(char c){
	if(c=='W') return 0;
	if(c=='I') return 1;
	if(c=='N') return 2;
	if(c=='G') return 3;
}
int main(){
	for(int i=0;i<4;i++) scanf("%d",&num[i]);
	for(int i=0;i<4;i++){
		while(num[i]--){
			char c[2];scanf("%s",c);
			t[f(c[0])][f(c[1])].push_back(i);
		}
	}
	scanf("%s",str);n=strlen(str);for(int i=n;i>=1;i--) str[i]=str[i-1];
	for(int i=1;i<=n;i++) dp[i][i][f(str[i])]=1;
	for(int len=1;len<n;len++){
		for(int i=1;i<=n-len;i++){
			int j=i+len;
			for(int k=i;k<j;k++){
				for(int l1=0;l1<4;l1++){
					for(int l2=0;l2<4;l2++){
						if(dp[i][k][l1]&&dp[k+1][j][l2]){
							for(int l=0;l<t[l1][l2].size();l++) dp[i][j][t[l1][l2][l]]=1;
						}
					}
				}
			}
		}
	}
	bool flag=1;
	for(int i=0;i<4;i++){
		if(dp[1][n][i]) putchar(o[i]),flag=0;
	}
	if(flag) printf("The name is wrong!");
	return 0;
}
2023/1/10 15:24
加载中...