刚学区间dp,感觉这个代码时间复杂度应该是 O(n3×64),为什么不会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;
}