题意:中文题就解释了
题解: dp[i][j]表示前i 个轮盘 和一个字符串前j 个字符的匹配情况 ,具体的状态转移解释见代码
#include <cstdio> #include <cstring> #include <iostream> #include <string> using namespace std; int n,m,q; int vis[350][1005]; int dp[350][1005]; int main() { cin>>n>>m>>q; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++)// lunpan { string s; cin>>s; for(int j=0;j<m;j++)// meiyi wei { if(s[j]==‘#‘) vis[i][30]=1;// ‘#‘ else vis[i][s[j]-‘a‘]=1; } } while(q--) { char s[20000]; scanf("%s",s+1); memset(dp,0,sizeof(dp)); int len=strlen(s+1); if(len > n) { cout<<"NO"<<endl; continue; } dp[0][0]=1;// 初始情况,这个地方好好琢磨一下 写的时候还是出了很多细节问题 for(int i=0;i <= n;i++) // lunpan { for(int j=0;j<=len;j++) { if(dp[i][j] == 0) continue; // 如果当前位置无法匹配 那就不需要进行之后的匹配了 if(vis[i+1][s[j+1]-‘a‘] == 1) dp[i+1][j+1] = 1; // i+1 和j+1位置 的字符能够匹配且dp[i][j]==1 那么能够匹配 if(vis[i+1][30] == 1) dp[i+1][j] = 1; // 如果i+1有‘#’字符且dp[i][j]==1,那么dp[i+1][j]的值也就是1了 } } if(dp[n][len] == 1) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }