关于时间复杂度
查看原帖
关于时间复杂度
416192
kbzcz楼主2023/6/8 13:51

刚学区间dp,感觉这个代码时间复杂度应该是 O(n3×64)O(n^3\times64),为什么不会TLE。有哪位大佬解答一下。

#include <bits/stdc++.h>
#define s1 first
#define s2 second
using namespace std;
typedef pair<int,int> PII;
const int M=210;
int W,I,N,G,n;
int dp[M][M][M];
vector<PII> ch[5];
bool res[M],ans; 
char str[M],ds[5]={'X','W','I','N','G'};
bool findstr(int x,int y,int z,int p) {
	for(int i=0;i<ch[p].size();i++) {
		if(dp[x][y][ch[p][i].s1]&&dp[y+1][z][ch[p][i].s2]) return 1;
	}
	return 0;
}
int main() {
	scanf("%d%d%d%d",&W,&I,&N,&G);
	for(int i=1;i<=W;i++) {
		char s[5];
		scanf("%s",s);
		ch[1].push_back({s[0],s[1]});
	}
	for(int i=1;i<=I;i++) {
		char s[5];
		scanf("%s",s);
		ch[2].push_back({s[0],s[1]});
	}
	
	for(int i=1;i<=N;i++) {
		char s[5];
		scanf("%s",s);
		ch[3].push_back({s[0],s[1]});
	}
	
	for(int i=1;i<=G;i++) {
		char s[5];
		scanf("%s",s);
		ch[4].push_back({s[0],s[1]});
	}
	scanf("%s",str+1);n=strlen(str+1);
	for(int i=1;i<=n;i++) {
		dp[i][i][str[i]]=1;
	}
	for(int len=2;len<=n;len++) {
		for(int i=1;i<=n-len+1;i++) {
			int j=i+len-1;
			for(int k=i;k<j;k++) {
				for(int p=1;p<=4;p++) {
					if(findstr(i,k,j,p)) dp[i][j][ds[p]]=1;
				}
			}	
		}
	}
	for(int i=1;i<=200;i++) {
		if(dp[1][n][i]) res[i]=1,ans=1;
	}
	if(!ans) puts("The name is wrong!");
	else {
		if(res['W']) putchar('W');
		if(res['I']) putchar('I');
		if(res['N']) putchar('N');
		if(res['G']) putchar('G');
	}
	return 0;
}
2023/6/8 13:51
加载中...