【暑假复习】【搜索】AOJ0033:Ball

来源:互联网 发布:北通 知乎 编辑:程序博客网 时间:2024/06/06 10:17

题意

将一个长度为10,包含0–9所有数字的数字串从头开始放入两个不同的数字串的末尾,要求这两个数字串从前往后递增。


题解

暴力地01枚举,分别考虑放第一个串或第二个,每次判断是否合法,放完即可返回。
复杂度2的n次方,n<=10,不会超时

#include<cstdio>#include<cstring>#include<algorithm>#include<stack>#define SF scanf#define PF printf#define MAXN 20using namespace std;int num[MAXN],q,n=10;stack<int> a,b;int dfs(int x){    if(x==n+1)        return 1;    int res=0;    if(a.empty()||num[x]>a.top()){        a.push(num[x]);        res=max(res,dfs(x+1));        a.pop();    }    if(b.empty()||num[x]>b.top()){        b.push(num[x]);        res=max(res,dfs(x+1));        b.pop();    }    return res;}int main(){    SF("%d",&q);    while(q--){        for(int i=1;i<=n;i++)            SF("%d",&num[i]);        if(dfs(1)==1)            PF("YES\n");        else            PF("NO\n");    }}
原创粉丝点击