HDU-4272 LianLianKan (dfs)

题意:多测试样例,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;
}
原文地址:https://www.cnblogs.com/Tianwell/p/11225162.html