Description

统计 \(1...n\) 的排列,恰好进行 \(k\) 次相邻交换和至多进行 \(k\) 次交换生成的不同的序列个数.

Sol

DP.

好妙的题啊...

首先看第一个问题.

对于相邻元素的交换,我们建立状态 \(f[i][j]\) 表示前 \(i\) 个数进行 \(j\) 次交换的方案数.

我们分类来讨论 \(i\) 元素是否参与交换.

如果不参与交换 \(f[i][j]+=f[i-1][j]\)

如果参与交换,那么它最远能交换到的位置就是 \(i-j\) \(f[i][j]+=f[i-1][u],max\{ i-j,0 \}\leqslant u \leqslant j-1\)

其实合起来就是 \(f[i][j]=\sum_{u=max\{0,i-j\}} ^{j} f[i-1][u]\) ,前缀和搞一下就可以了.

然后第二个问题.

继续来分类讨论 \(i\) 元素是否参与交换.

如果不参与交换 \(f[i][j]+=f[i-1][j]\)

如果参与交换,那么它可以和前面任意一个元素交换 \(f[i][j]+=f[i-1][j-1]*(i-1)\)

非常简单啊...

至于最后的判重就更简单了,因为换两次可以换回来,那么就让 \(f[i][j]-f[i][j-2]\) 这才是 \(f[i][j]\) 真正的贡献.

PS:我好像卡常卡到第一了...

Code

#include<cstdio>
#include<iostream>
using namespace std; typedef long long LL;
const int N = 3005;
const LL p = 1000000007;
#define debug(a) cout<<#a<<"="<<a<<" " int n,k;
LL f[N][N]; int main(){
cin>>n>>k;
f[1][0]=1;
for(int i=0;i<=k;i++) f[2][i]=i+1;
for(int i=3;i<=n;i++) for(int j=0;j<=k;j++){
int l=j-min(j,i-1)-1;
f[i][j]=(f[i-1][j]-(l>=0?f[i-1][l]:0LL)+p)%p;
f[i][j]=(f[i][j]+f[i][j-1])%p;
}
//for(int i=1;i<=n;i++) for(int j=0;j<=k;j++) printf("%lld%c",f[i][j]," \n"[j==k]);
cout<<(f[n][k]-f[n][k-1]+p)%p<<" "; f[1][0]=1;
for(int i=0;i<=k;i++) f[2][i]=1;
for(int i=3;i<=n;i++) for(int j=0;j<=k;j++){
f[i][j]=f[i-1][j];
f[i][j]=(f[i][j]+f[i-1][j-1]*(i-1)%p)%p;
}
//for(int i=1;i<=n;i++) for(int j=0;j<=k;j++) printf("%lld%c",f[i][j]," \n"[j==k]);
LL ans=0;
for(int i=k;i>1;i--) ans=(ans+f[n][i]-f[n][i-2]+p)%p;
ans=(ans+f[n][0]+f[n][1])%p;
cout<<ans<<endl; return 0;
}

  

Code

51Nod 1250 排列与交换的更多相关文章

  1. 51nod 1250 排列与交换——dp

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1250 仔细思考dp. 第一问,考虑已知 i-1 个数有多少种方案. ...

  2. 51Nod 1250 排列与交换 —— DP

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1250 看了半天... 把第一问想成逆序对的话似乎很容易想了,新加入 ...

  3. php实现字符串的排列(交换)(递归考虑所有情况)

    php实现字符串的排列(交换)(递归考虑所有情况) 一.总结 交换: 当有abc的时候,分别拿第一位和其它位交换,第一位固定,余下的位做递归,这样有考虑到所有情况,因为第一位只可能是所有的字母,那第一 ...

  4. 51nod 1574 排列转换(贪心+鸽巢原理)

    题意:有两个长度为n的排列p和s.要求通过交换使得p变成s.交换 pi 和 pj 的代价是|i-j|.要求使用最少的代价让p变成s. 考虑两个数字pi和pj,假如交换他们能使得pi到目标的距离减少,p ...

  5. 51nod 1574 排列转换(猜结论)

    分析 猜了一下结论,居然对了..........具体操作是:假设排列s是1,2,3,...,nk为排列p中最大的 没有放到正确位置的数,k的位置为posk的右边一定有一个数x<=pos(因为&l ...

  6. 51nod 1843 排列合并机(DP+组合)

    题解链接 不过求ggg不用O(n2)DPO(n^2)DPO(n2)DP,g[n]g[n]g[n]直接就是卡特兰数的第n−1n-1n−1项.即: g[n]=(2(n−1)n−1)−(2(n−1)n−2) ...

  7. 对象的比较与排序:IComparable和IComparer接口

    IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口提供一个返回值类似(大于0 等于0 小于0)的比较方法,二者区别如下: . ICompar ...

  8. UVa 11077 (循环分解 递推) Find the Permutations

    把{1, 2, 3,,, n}叫做自然排列 本题便是求有多少个n元排列P要至少经过k次交换才能变为自然排列. 首先将排列P看做置换,然后将其分解循环,对于每个长度为i的循环至少要交换i-1次才能归位. ...

  9. CF(441D Valera and Swaps)置换群

    题意:1-n的一个排列, p2, ..., pn,f(p)的定义是此排列要交换最少的数对能够回到原排列1,2,3,4...n.给一个排列p.要将其变换成f值为m的排列,问至少要交换几个数对,并输出字典 ...

随机推荐

  1. 自然语言14_Stemming words with NLTK

    https://www.pythonprogramming.net/stemming-nltk-tutorial/?completed=/stop-words-nltk-tutorial/ # -*- ...

  2. Latent Semantic Analysis (LSA) Tutorial 潜语义分析LSA介绍 一

    Latent Semantic Analysis (LSA) Tutorial 译:http://www.puffinwarellc.com/index.php/news-and-articles/a ...

  3. jquery条件选择多个元素(与、或者)

    或者:选择器用逗号分隔,这也对应了jquery对象转dom为$(obj)[0]的写法 如:$('div[name="a"],div[name="b"]') :h ...

  4. Javascript中call、apply、bind函数

    javascript在函数创建的时候除了自己定义的参数外还会自动新增this和arguments两个参数 javascript中函数也是对象,call.apply.bind函数就是函数中的三个函数,这 ...

  5. array_filter移除空数组

    $arr = array( "0"=> "564645", "1"=>"", "2"=& ...

  6. js中,还真不了解 console

    参考链接: https://segmentfault.com/a/1190000000481884

  7. C-基本语法与运算

    编译: Technorati 标记: C 1, 编译compilers 命令make 将高级语言转换为低级语言. clang: 1,预处理(preprocessing) 2,编译(complition ...

  8. ASP.NET MVC使用Bootstrap系列(5)——创建ASP.NET MVC Bootstrap Helpers

    阅读目录 序言 内置的HTML Helpers 创建自定义的Helpers 使用静态方法创建Helpers 使用扩展方法创建Helpers 创建Fluent Helpers 创建自动闭合的Helper ...

  9. Quartz.Net 基于XML配置启动

    1.App.config <configSections> <section name="quartz" type="System.Configurat ...

  10. Mysql存储过程查询结果赋值到变量的方法

    Mysql存储过程查询结果赋值到变量的方法   把查询结果赋值到变量,大部分情况下使用游标来完成,但是如果明确知道查询结果只有一行(例如统计记录的数量,某个字段求和等),其实可以使用set或into的 ...