Problem Description
I like playing game with my friend, although sometimes looks pretty naive. Today I invent a new game called LianLianKan. The game is about playing on a number stack.
Now we have a number stack, and we should link and pop the same element pairs from top to bottom. Each time, you can just link the top element with one same-value element. After pop them from stack, all left elements will fall down. Although the game seems to be interesting, it‘s really naive indeed.
To prove I am a wisdom among my friend, I add an additional rule to the game: for each top element, it can just link with the same-value element whose distance is less than 6 with it.
Before the game, I want to check whether I have a solution to pop all elements in the stack.
Input
There are multiple test cases.
The first line is an integer N indicating the number of elements in the stack initially. (1 <= N <= 1000)
The next line contains N integer ai indicating the elements from bottom to top. (0 <= ai <= 2,000,000,000)
Output
For each test case, output “1” if I can pop all elements; otherwise output “0”.
Sample Input
2
1 1
3
1 1 1
2
1000000 1
Sample Output
1
0
0
Source
2012 ACM/ICPC Asia Regional Changchun Online
注意给的顺序是从底部到顶部。
开始想直接模拟,不可行,因为在下面5个里可能有一个或多个相同的元素,每个选择都可能对后面造成影响,因此要dfs。
其中还巧妙的用了map,当然改用set来存然后看里面到底有没有奇数个的元素也是可以的,这点的优化很重要。
1 #include<stdio.h> 2 #include<iostream> 3 #include<string> 4 #include<cstring> 5 #include<algorithm> 6 #include<queue> 7 #include<set> 8 #include<map> 9 10 using namespace std; 11 12 int vis[1001],a[1001]; 13 14 int dfs(int n) 15 { 16 int i=0,j=n-1; 17 while(n>=0&&vis[n]) --n; 18 if(n==-1) return 1; 19 if(n==0&&!vis[0]) return 0; 20 while(i<=5) 21 { 22 if(j<0) return 0; 23 if(vis[j]) --j; 24 if(a[n]==a[j]) 25 { 26 vis[j]=1; 27 if(dfs(n-1)) return 1; 28 vis[j]=0; 29 } 30 ++i; 31 --j; 32 } 33 return 0; 34 } 35 36 int main() 37 { 38 int k,m,q,t,p,n; 39 int T; 40 map<int,int> mp; 41 map<int,int>::iterator it; 42 43 while(cin>>n) 44 { 45 t=0; 46 for(int i=0;i<n;++i) 47 { 48 scanf("%d",&a[i]); 49 vis[i]=0; 50 mp[a[i]]++; 51 } 52 53 for(it=mp.begin();it!=mp.end();++it) 54 { 55 if((*it).second%2) 56 { 57 t=1; 58 break; 59 } 60 } 61 62 if(t) 63 { 64 cout<<0<<endl; 65 }else 66 { 67 cout<<dfs(n-1)<<endl; 68 } 69 70 } 71 return 0; 72 }