题意:多测试样例,N个元素(1 <= N <= 1000),每个元素的值为(0<= ai <= 2,000,000,000),这些元素被压入栈中,与栈顶相同的可以一起消除(每次将与top相同的相连必须距离在6以内),问最后是否能将整个栈弹出
思路:用dfs来递归寻找可能的方案
关于删除操作(一开始想到用list但是感觉按位置删除比较麻烦所以用vis[]数组模拟)
(优化):如果n为奇数也消除不完(没有匹配的),如果某个数的个数为奇数,那么这个栈绝对弹不完,所以这样就可以提前预判一些 。(我们可以用map来统计每个数的个数)
完整代码:
#include<cstdio> #include<iostream> #include<string> #include<cstring> #include<algorithm> #include<map> using namespace std; int vis[1001],a[1001]; int dfs(int n) { int i=0,j=n-1; while(n>=0&&vis[n]) --n; if(n==-1) return 1; if(n==0&&!vis[0]) return 0; while(i<=5) { if(j<0) return 0; if(vis[j]) --j; if(a[n]==a[j]) { vis[j]=1; if(dfs(n-1)) return 1; vis[j]=0; } ++i; --j; } return 0; } int main() { int k,m,q,t,p,n; int T; map<int,int> mp; map<int,int>::iterator it; while(cin>>n) { t=0; for(int i=0;i<n;++i) { scanf("%d",&a[i]); vis[i]=0; mp[a[i]]++; } if(n&1) { cout<<0<<endl; continue; } for(it=mp.begin();it!=mp.end();++it) { if((*it).second%2) { t=1; break; } } if(t) { cout<<0<<endl; }else { cout<<dfs(n-1)<<endl; } } return 0; }