时间限制:1s

内存限制:256MB

【问题述】

对于一个1~n的排列,如果满足第i个数|ai-i|<=k,则称该排列为K-近似排列。

现在排列的若干位置已经确定,你需要计算剩下的数有多少种排列方法使得形成的排列是K-近似排列。

【输入】

输入文件名为count.in。

第一行一个数T(<=10),表示数据组数

对于每一组数据:

第一行三个数n,m,k,分别表示排列长度、已确定位置的个数和近似参数K

接下来m行,每行两个数x、y,表示已经确定第x个数是y

【输出】

输出文件名为count.out。

对于每组数据输出一行,包含一个数,表示方法个数(对1,000,000,007取模)

【输入输出样例】

count.in

count.out

1

4 1 1

2 3

1

【数据说明】

对于30%的数据,1<=n,m<=10,k<=2

对于50%的数据,1<=n,m<=20,k<=2

对于70%的数据,1<=n<=100000,m<=100,k<=2

对于100%的数据,1<=n<=10^9,m<=100,k<=2

坑啊,题目给的样例不对,他写的是2,其实是1.!

小暴力50分

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,k,t;
int a[];
bool vis[];
long long ans;
void dfs(int x)
{
if(x==n+)
{
ans++;
return ;
}
if(a[x]) dfs(x+);
else
{
if(x>=)
if(!vis[x-k])
{
vis[x-k]=;
dfs(x+);
vis[x-k]=;
return ;
} for(int i=max(x-k,);i<=min(x+k,n);i++)
if(!vis[i])
{
vis[i]=;
dfs(x+);
vis[i]=;
}
}
return ;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++) a[i]=,vis[i]=;
ans=;
for(int i=,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
a[x]=y;vis[y]=;
}
dfs();
printf("%lld\n",ans);
}
return ;
}

50分暴力

也可以用状压dp做

  定义f[j]为当前位上状态为j的方案数,j是一个二进制数,对一每一位上1代表这个数用过,0代表没用过。(其实能用二维的,习惯用一维,有个二维代码)

  对于每个状态,看看能否和    i-k到i+k中每个数拓展,,能拓展的话,就向更大的数扩展。(就是说看看这些数选没选,没选过的话就加过去)。

  

70分还是没写出来。。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int P=;
int f[<<],a[];
int t,n,m,k;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
memset(a,-,sizeof(a));
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
x--,y--;
a[x]=y;
}
memset(f,,sizeof(f));
for(int i=;i<=k&&i<n;i++)
{
if(a[]!=-&&a[]!=i) continue;
f[<<i]=;
} for(int i=;i<n-;i++)
for(int j=(<<n)-;j>=;j--)
{
if(!f[j]) continue;
for(int t=max(,i+-k);t<=min(n-,i++k);t++)
{
if(j>>t&) continue;
if(a[i+]!=-&&a[i+]!=t) continue;
f[j|(<<t)]=(f[j|(<<t)]+f[j])%P;
}
}
printf("%d\n",f[(<<n)-]); }
return ;
}

50分状压dp-一维

50分DP

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int P=;
int f[][<<],a[];
int t,n,m,k;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
memset(a,-,sizeof(a));
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
x--,y--;
a[x]=y;
}
memset(f,,sizeof(f));
for(int i=;i<=k&&i<n;i++)
{
if(a[]!=-&&a[]!=i) continue;
f[][<<i]=;
} for(int i=;i<n-;i++)
for(int j=;j<(<<n);j++)
{
if(!f[i][j]) continue;
for(int t=max(,i+-k);t<=min(n-,i++k);t++)
{
if(j>>t&) continue;
if(a[i+]!=-&&a[i+]!=t) continue;
if(abs(t-(i+))>k) continue;
f[i+][j|(<<t)]=(f[i+][j|(<<t)]+f[i][j])%P;
}
} printf("%d\n",f[n-][(<<n)-]); }
return ;
}

二维

P4876 近似排列计数50的更多相关文章

  1. BZOJ 4517: [Sdoi2016]排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 911  Solved: 566[Submit][Status ...

  2. bzoj-4517 4517: [Sdoi2016]排列计数(组合数学)

    题目链接: 4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 846  Solved: 530[Submit][ ...

  3. 数学(错排):BZOJ 4517: [Sdoi2016]排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 693  Solved: 434[Submit][Status ...

  4. 【数论·错位排列】bzoj4517 排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1428  Solved: 872[Submit][Statu ...

  5. bzoj4517排列计数 错排+组合

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1491  Solved: 903[Submit][Statu ...

  6. BZOJ_4517_[Sdoi2016]排列计数_组合数学

    BZOJ_4517_[Sdoi2016]排列计数_组合数学 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[ ...

  7. BZOJ 4517--[Sdoi2016]排列计数(乘法逆元)

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1727  Solved: 1067 Description ...

  8. 洛谷P4071 [SDOI2016] 排列计数 [组合数学]

    题目传送门 排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m ...

  9. [BZOJ4517][SDOI2016]排列计数(错位排列)

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1616  Solved: 985[Submit][Statu ...

随机推荐

  1. POJ3468 A Simple Problem with Integers(数状数组||区间修改的RMQ问题)

    You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of op ...

  2. 作业3rd

    第三周作业 课本学习 使用nmap扫描特定靶机 使用nessus扫描特定靶机 靶机网络情况如下 在攻击机使用Nessus,步骤如下 新建一个扫描 填入目的主机ip,点击开始进行扫描 等待 扫描结果如下 ...

  3. python爬虫知识点总结(二)爬虫的基本原理

    一.什么是爬虫? 答:请求网页并提取数据的自动化程序. 二.爬虫的基本流程 三.什么是Request和Response? 1.Request 2.Response 四.能抓取怎样的数据 五.解析方式 ...

  4. [转]ECMAScript5 Object的新属性方法

    虽然说现在并不是所有的浏览器都已经支持ECMAScript5的新特性,但相比于ECMAScript4而言ECMAScript5被广大浏览器厂商广泛接受,目前主流的浏览器中只有低版本的IE不支持,其它都 ...

  5. poj2279排队——杨氏矩阵与钩子公式(DP爆内存)

    题目:http://poj.org/problem?id=2279 书上的DP做法会爆内存,尝试写了一个,过了样例. 转载: 代码如下: #include<iostream> #inclu ...

  6. Jasper:推送 API

    ylbtech-Jasper:推送 API Control Center 还维护一个“推送 API”系统,一旦发生特定事件,就会向应用程序发送编程通知.例如,您可能选择在设备接近流量上限时收到通知.或 ...

  7. zoj3826 Hierarchical Notation (字符串模拟)

    Hierarchical Notation Time Limit: 2 Seconds      Memory Limit: 131072 KB In Marjar University, stude ...

  8. 2-1 本章作业&2-2 开发系统与工具选择

    2-1 2-2 推荐使用Android Studio开发Flutter

  9. 解决错误---undefined reference to `pthread_create‘

    今天试着敲了一下APUE的小例子,遇到了个错误 -----  undefined reference to `pthread_create.(为自己这么晚接触多线程惭愧). 上网上查了一下,借人经验. ...

  10. POJ - 2377 Bad Cowtractors Kru最大生成树

    Bad Cowtractors Bessie has been hired to build a cheap internet network among Farmer John's N (2 < ...