悬赏5rmb求调记搜(附完整思路)
查看原帖
悬赏5rmb求调记搜(附完整思路)
253765
houpingze楼主2024/11/19 16:36

如题。感觉细节我不是很能考虑清楚,哪位大佬救救/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;
}


2024/11/19 16:36
加载中...