题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1250

看了半天...

把第一问想成逆序对的话似乎很容易想了,新加入一个数,可以往前挪动,增加的逆序对数就是它后面那些数的个数;

所以 f[i][j] = ∑(k = max( 0 , j - i + 1)) f[i-1][k],用前缀和即可;

第二问正好用第一类斯特林数;

第一类斯特林数 str[i][j] 表示把 i 个数分成 j 个环,环有顺序的方案数,str[i][j] = str[i-1][j-1] (自成一环) + ( i - 1 ) * str[i-1][j] (跟到某个后面)

对应到这道题,原来每个数自己是一个环,表示它就在自己的位置上;

一个有顺序的环,按一个顺序往过数,一个数到下一个数相互交换,就对应了一种交换;

str[i][j] 中,i - j 个数与别的环合并,也就是发生了一次交换,所以答案就是 ∑(n - k <= i <= n ) str[n][i]

注意不要 MLE ...

用滚动数组求斯特林数得注意一点,初值 str[0][0] 不要赋成1,然后后面 i == j 时也求出来即可,感性理解一下的话~

这题...好像也不难啊。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const maxn=,mod=;
int n,m;
ll f[][maxn],s[][maxn],str[][maxn],ans1,ans2;
void init()
{
// for(int i=0;i<=1;i++)str[i][i]=1;
str[][]=;//滚动数组!让初始化符合意义
for(int i=;i<=n;i++)
for(int j=;j<=i;j++)//因为滚动所以 str[i][i]也在这里求
{
int p=(i&),q=!p;
str[p][j]=(str[q][j-]+(i-)*str[q][j]%mod)%mod;
}
}
int main()
{
scanf("%d%d",&n,&m);
init();
for(int i=;i<=;i++)
{
f[i][]=,s[i][]=;
for(int j=;j<=m;j++)s[i][j]+=s[i][j-];
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
int p=(i&),q=!p;
if(j-i+<=)f[p][j]=s[q][j];
else f[p][j]=(s[q][j]-s[q][j-i]+mod)%mod;
if(j)s[p][j]=(s[p][j-]+f[p][j])%mod;
else s[p][j]=f[p][j];
}
int tmp=m;
while(tmp>=)ans1=(ans1+f[n&][tmp])%mod,tmp-=;
for(int i=n-m;i<=n;i++)ans2=(ans2+str[n&][i])%mod;
printf("%lld %lld\n",ans1,ans2);
return ;
}

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

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

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

  2. 51Nod 1250 排列与交换

    Description 统计 \(1...n\) 的排列,恰好进行 \(k\) 次相邻交换和至多进行 \(k\) 次交换生成的不同的序列个数. Sol DP. 好妙的题啊... 首先看第一个问题. 对 ...

  3. [luoguP2606] [ZJOI2010]排列计数(DP)

    传送门 如果能够根据题意看出这是一个堆的话,那么就有些思路了.. 首先堆顶必须是最小元素,然后左右儿子可以预处理出来都有多少个数, 把剩余的数任意分配给两个儿子,用排列组合即可 dp(now) = d ...

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

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

  5. 51nod 1020 逆序排列 递推DP

    1020 逆序排列  基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么 ...

  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. 51nod 1043 幸运号码(数位dp)

    题目链接:51nod 1043 幸运号码 题解:dp[i][j]表示 i 个数和为 j 的总数(包含0开头情况) dp[i][j] = dp[i-1][j-k] i & 1 :这里用滚动数组节 ...

  8. 51nod 1092 回文字符串 (dp)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1092 这个题是poj-3280的简化版,这里只可以增加字符,设 dp[i ...

  9. 51Nod 1201 整数划分 (经典dp)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201 题意不多说了. dp[i][j]表示i这个数划分成j个数 ...

随机推荐

  1. ThinkPHP---thinkphp框架介绍

    目录: (1)简述: (2)下载: (3)文件结构: (4)部署: (5)细节问题: 主体: (1)简述 ThinkPHP诞生于2006年初,最初叫FSC.于2007年元旦更名为PHP,同时官网上线. ...

  2. 08Microsoft SQL Server 数据查询

    Microsoft SQL Server 数据查询 单表查询所有列 --查询所有行所有列 select all * from table; --查询不重复行的所有列 select distinct * ...

  3. Deepin系统关于每次启动终端都要输入source /etc/profile的问题

    关于每次启动终端都要输入source /etc/profile的问题 当我在Deepin系统中下载了node以及npm之后,我为了将node导入到系统文件,使用了以下命令sudo gedit ``/e ...

  4. C++ Primer(第4版)-学习笔记-第4部分:面向对象编程与泛型编程

    第15章 面向对象编程OOP(Object-oriented programming)           面向对象编程基于三个基本概念:数据抽象.继承和动态绑定.      在 C++ 中,用类进行 ...

  5. Python面向对象之面向对象基本概念

    面向过程和面向对象概念 过程和函数:过程类似于函数,只能执行,但是没有返回结果:函数不仅能执行,还能返回结果. 面向过程和面向对象 基本概念 面向过程-怎么做 把完成某一个需求的所有步骤从头到尾逐步实 ...

  6. POJ 3468 线段树区间修改查询(Java,c++实现)

    POJ 3468 (Java,c++实现) Java import java.io.*; import java.util.*; public class Main { static int n, m ...

  7. 3.2.1.1 POSIX方括号表达式

        为配合非英语的环境,POSIX 标准强化其字符集范围的能力(例如,[a-z]),以匹配非英文字母字符.       POSIX 也在一般术语上作了些变动,我们早先看到的范围表达式在 UNIX  ...

  8. [USACO5.3]校园网Network of Schools 缩点

    题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中. 你要写 ...

  9. md5加密的工具类(from 韩顺平)

    输入一个字符串,然后可以进行md5加密 import java.security.*; import java.security.spec.*; public class MyTools { publ ...

  10. 【转】建立一个更高级别的查询 API:正确使用Django ORM 的方式

    这个就比较深入啦... http://www.oschina.net/translate/higher-level-query-api-django-orm 结论: 在视图和其他高级应用中使用源生的O ...