Topcoder SRM 636 Div2 B

来源:互联网 发布:五级三阶制算法 编辑:程序博客网 时间:2024/05/21 05:57

题意:定义一种数叫做”sortedness”,对于i<ja[i]<a[j],数组中0表示对应得位置没有数,求在在没有数的地方将缺失的数填上使得数组的sortedness 的大小等于给定的sortedness的方案数。同时保证在一个数组中0的个数不会超过5个。

思路:由于缺失的数最大只有5个,所以直接枚举他们的排列组合,判断是不是等于给定的数。O(120n).

#include <bits/stdc++.h>using namespace std;class SortishDiv2{    public:    int a[110],s[110];    int b[110];    bool vis[110];    int ans;    int Judge(int num,int n)    {        int ant = 0 ;        for(int i= n-1;i>=0;i--)        {            for(int j = i+1;j<n;j++)            {                if(s[i] < s[j]) ant++;                if(ant > num) return 0;            }        }        return ant == num;    }    void dfs(int num,int ss,int n)    {        if(num == a[0])        {            ans += Judge(ss ,n);            return ;        }        for(int i = 1;i<=a[0];i++)        {            if(vis[a[i]]) continue;            vis[a[i]] = true;            s[b[num+1]] = a[i];            dfs(num+1,ss,n);            vis[a[i]] = false;        }    }    int ways(int sortedness, vector <int> seq)    {        int n = seq.size();        if(sortedness > n*n ) return 0;        memset(vis,false,sizeof(vis));        b[0] = 0; a[0] = 0;        for(int i = 0;i<n;i++)        {               s[i] = seq[i];            if(seq[i] == 0)            {                b[++b[0]] = i;            }            else vis[seq[i]] = true;        }        for(int i = 1;i<=n;i++)        {            if(!vis[i]) a[++a[0]] = i;        }        memset(vis,false,sizeof(vis));        ans = 0;        dfs(0,sortedness,n);        return ans;         }};
0 0
原创粉丝点击