如题。感觉细节我不是很能考虑清楚,哪位大佬救救/ll
另外 85 行确实写挂了,但是是小问题
这是完整的思路,应该挺清楚的:

没删调试的 code :
/*
writer: houpingze
Problem: 不知名屑题
Knowledge: 垃圾算法
Time: O(过不了)
PS:\CCF/ \CCF/ \CCF/ \CCF/ \CCF/
*/
/*
Note:
*/
#include<bits/stdc++.h>
#define MN 114514
#define reg register int
#define INF (1<<30)
#define pb push_back
#define vc vector
#define fst first
#define scd second
#define int long long
#define rep(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
int read(){
int res=0,fs=1; char c=getchar();
while(!(c>='0' && c<='9')){ if(c=='-')fs=-1; c=getchar(); }
while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();
return res*fs;
}
void print(int x){
if(x<0) { putchar('-'); x=-x;}
if(x>9) print(x/10);
putchar(x%10+'0');
}
int n,cnt,m,a[500010],ans,tmp,k;
typedef pair<int,int> P;
//struct PROBLEM_SOLVER{
// int n,m;
//}solver;
//signed main(){
void py(){
cout<<"YES\n";
}
void pn(){
cout<<"NO\n";
}
map<int,int>t;
string s;
int ddd[505][555];
bool check(int l,int r){//判断[l,r]区间是否可以为S形式
if(ddd[l][r]!=-1) return ddd[l][r];//记忆化
if(r-l+1>k) return 0;//因为不能有超过k个*
if(l>r) return ddd[l][r]=1;
if((s[l]=='*'||s[l]=='?')&&(s[r]=='*'||s[r]=='?')){
return ddd[l][r]=check(l+1,r-1);
}
return ddd[l][r]=0;
}
int F[555][555],G[555][555],D[555][555];
bool vF[555][555],vG[555][555],vD[555][555];
int f(int l,int r);
int d(int l,int r);
int g(int l,int r);
const int mod=1e9+7;
int f(int l,int r){
// if(l==r&&s[l]!='('&&s[r]!=')') return 1;
if(l>=r) return 0;
if(vF[l][r]) return F[l][r];
vF[l][r]=1;
int ans=d(l,r);
for(int len=1;len<=k;len++){
ans=(ans+g(l,r-len)*d(r-len+1,r))%mod;
}
cout<<"f "<<l<<' '<<r<<' '<<"="<<ans<<endl;
return F[l][r]=ans;
}
int d(int l,int r){//本原
if(l>=r||s[l]=='*'||s[r]=='*') return 0;
if(l+1==r) return (s[l]=='('||s[l]=='?')&&(s[r]=='?'||s[r]==')');
if(vD[l][r]) return D[l][r];
vD[l][r]=1;
int ans=((r-l-1)<=k)+f(l+1,r-1);//这里斜挂了
for(int len=1;len<=k;len++){
ans+=f(l,r-len)*check(r-len+1,r)+f(l+len,r)*check(l,l+len-1);
ans%=mod;
}
cout<<"d "<<l<<' '<<r<<' '<<"="<<ans<<endl;
return D[l][r]=ans;
}
int g(int l,int r){
// if(l==r&&s[l]!='('&&s[r]!=')') return 1;
if(l>=r) return 0;
if(vG[l][r]) return G[l][r];
vG[l][r]=1;
int ans=0;
for(int len=1;len<=k;len++){
ans=(ans+f(l,r-len)*check(r-len+1,r))%mod;//还要check r-len+1 ~ r 是否合法
}
cout<<"g "<<l<<' '<<r<<' '<<"="<<ans<<endl;
return G[l][r]=ans;
}
signed main() {
cin>>n>>k;
cin>>s;
s=' '+s;
// cout<<f(3,4)<<endl;
cout<<f(1,n);
return 0;
}