暴力50分,有没有能记忆化优化时间的方法呢
查看原帖
暴力50分,有没有能记忆化优化时间的方法呢
1043309
rqliushuangyu楼主2024/10/27 14:52

代码有点啰嗦,主要是暴力。有没有办法用记忆化呢??

#include<bits/stdc++.h>
using namespace std;
struct thi {int idx,val;};
struct ti{int idx,iidx;};
int t;
int n,k,q;
vector<thi> a[6][100009];
vector<ti> aidx[6][200009];
//分别是:还剩几人 末尾值 上一次第几人  
bool dfs(int ren,int aid,int shang  ){//到头来用记忆化
   if(ren==1){ 
   	for(int i=0;i<aidx[t][aid].size();i++){
   		if(aidx[t][aid][i].idx==shang)continue;
   		int id=aidx[t][aid][i].idx,j=aidx[t][aid][i].iidx-1;
   		for(;j>=0 && a[t][id][j].val!=1 && (aidx[t][aid][i].iidx-j+1)<=k;j--);
   		if(a[t][id][j].val==1&& (aidx[t][aid][i].iidx-j+1)<=k)return 1;
   	}
   	return 0;
   }
   //否则找随便一个
   for(int i=0;i<aidx[t][aid].size();i++){
   		if(aidx[t][aid][i].idx==shang)continue;
   		int id=aidx[t][aid][i].idx,j=aidx[t][aid][i].iidx-1;
   		for(;j>=0 &&(aidx[t][aid][i].iidx-j+1)<=k;j--){
   			if(dfs(ren-1,a[t][id][j].val,aidx[t][aid][i].idx))return 1;
   		}
   }
   return 0;
}
int main() {
//	freopen("chain.in","r",stdin);
//	freopen("chain.out","w",stdout);
   ios::sync_with_stdio(0);
   cin.tie(nullptr);cout.tie(nullptr);
   cin>>t;
   while(t--) {
   	cin>>n>>k>>q;
   	int l=0;
   	for(int i=0; i<n; i++) {
   		cin>>l;
   		int tmp;
   		for(int j=0; j<l; j++) {
   			cin>>tmp;
   			thi ttt;
   			ttt.idx=j,ttt.val=tmp;
   			a[t][i].push_back(ttt);
   			ti tt;
   			tt.idx=i;
   			tt.iidx=j;
   			aidx[t][tmp].push_back(tt);
   		}
   	}
   	while(q--) {
   		int r,c;
   		cin>>r>>c;
   		cout<<dfs(r,c,-1)<<endl;
   	}
   }
   return 0;
}

2024/10/27 14:52
加载中...