P4876 近似排列计数50
时间限制: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-一维
#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的更多相关文章
- BZOJ 4517: [Sdoi2016]排列计数
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 911 Solved: 566[Submit][Status ...
- bzoj-4517 4517: [Sdoi2016]排列计数(组合数学)
题目链接: 4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 846 Solved: 530[Submit][ ...
- 数学(错排):BZOJ 4517: [Sdoi2016]排列计数
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 693 Solved: 434[Submit][Status ...
- 【数论·错位排列】bzoj4517 排列计数
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1428 Solved: 872[Submit][Statu ...
- bzoj4517排列计数 错排+组合
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1491 Solved: 903[Submit][Statu ...
- BZOJ_4517_[Sdoi2016]排列计数_组合数学
BZOJ_4517_[Sdoi2016]排列计数_组合数学 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[ ...
- BZOJ 4517--[Sdoi2016]排列计数(乘法逆元)
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1727 Solved: 1067 Description ...
- 洛谷P4071 [SDOI2016] 排列计数 [组合数学]
题目传送门 排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m ...
- [BZOJ4517][SDOI2016]排列计数(错位排列)
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1616 Solved: 985[Submit][Statu ...
随机推荐
- Scala学习——泛型[T]的6种使用(初)
package com.dtspark.scala.basics /** * 1,scala的类和方法.函数都可以是泛型. * * 2,关于对类型边界的限定分为上边界和下边界(对类进行限制) * 上边 ...
- Virtualenwrapper
1. Introduction Virtualenvwrapper is a set of extensions to Ian Bicking's virtualenv tool. The exten ...
- 原生JS中unshift与shift
shift() 方法:shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值:用法:arrayObject.shift()如果数组是空的,那么 shift() 方法将不进行任何操作 ...
- sublime text3设置
我的sublime的设置,ps:这个博文只是为了我自己的一个记录 { "color_scheme": "Packages/Theme - Solarized Flat/S ...
- 如何编写新的PCL类
博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=244 把代码转换成符合PCL思路和句法的代码,对于第一次接触该基础架构的人会 ...
- XXX.h:143: error: expected declaration specifiers or ‘...’ before ‘YYY’
出现上面头文件错误,原因是定义YYY的头和XXX.h互相包含了
- minihttp安装配置ssl和c语言实现cgi
概述:参考了大牛们的方法,结合自己的环境做了修改,主要是讲:minihttp安装配置ssl和c语言实现cgi接收字符串并且保存系统环境:centos6.5 开发版 依赖软件包: mini_httpd- ...
- setInterval(callbackfunc,time)中callbackfunc传参数问题
var si=setInterval(callbackfunc,time)中callbackfunc传参数问题(循环执行) var st=setTimeout(callbackfunc,time);定 ...
- js基础(补10.10)
1.内嵌式: <html> <head> <title></title> </head> <body> <a href=& ...
- java继承使用的细节问题?
关于java继承的基本概念就不多说了,下面就说说继承使用应该注意的细节问题? 示例 一: package com.bizvane; class Fu{ public Fu() { System.out ...