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

仔细思考dp。

第一问,考虑已知 i-1 个数有多少种方案。再放入一个数,它是最大的且在最后面,所以它的位置不同的话,就是不同的方案。它在特定的位置,其余部分的值就是 i-1 的值。

  所以再用前缀和优化成 n^2 即可。k可减任意个2。

第二问,还是像上面一样考虑。但新来的数只会和前面的数交换一次。任何一种交换 k ( k>1 ) 次的方案都可以转换成前面的数先交换 k-1 次,再由新来的数交换一次。所以就能很方便地dp了。

还可以从逆序对的角度考虑第一问、从斯特林数的角度考虑第二问。反正式子是一样的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=,mod=1e9+;
int n,k,dp[][N],c[][N],ans,u,v;
int main()
{
scanf("%d%d",&n,&k);
dp[][]=;
for(int i=;i<=k;i++) c[][i]=;
u=;v=;
for(int i=;i<=n;i++)
{
for(int j=;j<=k;j++)
{
dp[u][j]=(c[v][j]-(j-i>=?c[v][j-i]:)+mod)%mod;
c[u][j]=(dp[u][j]+(j?c[u][j-]:))%mod;
}
u=!u;v=!v;
}
for(int i=k;i>=;i-=) (ans+=dp[v][i])%=mod;
printf("%d ",ans); ans=;
u=;v=;
memset(dp[],,sizeof dp[]); dp[][]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=k;j++)
dp[u][j]=(dp[v][j]+(j?(ll)dp[v][j-]*(i-)%mod:))%mod;
u=!u;v=!v;
}
for(int i=;i<=k;i++) (ans+=dp[v][i])%=mod;
printf("%d\n",ans);
return ;
}

51nod 1250 排列与交换——dp的更多相关文章

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

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

  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. Gaby Ivanushka(快排)

    Gaby Ivanushka Once upon a time there lived a tsar that has a daughter — Beautiful Vasilisa. There w ...

  2. iOS 多线程(队列、任务、串行、并行、同步、异步)

  3. AFN errorCode对应的状态码

    转 http://blog.csdn.NET/wangyanchang21/article/details/50932191 在很多时候都会遇到错误, 还会带有一些 Error Code , 比如在各 ...

  4. MySQL登陆数据库

    下面是几种登陆到MySql数据库的登陆方式代码 1mysql -u root -ppassword 2.mysql -u root -p Enter password:password3.mysql ...

  5. Django之restframework2视图三部曲

    视图三部曲 下面我来来看restframework是如何将冗余的代码一步步的进行封装. 这里主要用到的是多继承 第一步mixin类编写视图 AuthorModelSerializer: class A ...

  6. 7.Django模型类的定义和管理

    Django的模型类是给ORM层服务的 1.每个数据模型都是django.db.models.Model的子类. 2.它的父类Model包含了所有必要的和数据库交互的方法,并提供了定义数据库字段的语法 ...

  7. 在VS2010下打开VS2008项目的解决办法

    如何在vs2010中打开vs2008项目文件? 第一步:以记事本方式打开该项目的sln解决方案,找到这两行信息,分别如下:Microsoft Visual Studio Solution File,  ...

  8. 每天一个Linux命令(29)du命令

        du命令是对文件和目录磁盘使用的空间的查看.     (1)用法:     用法:  du  [选项]  [文件]     (2)功能:     功能:  报告磁盘空间使用情况     (3) ...

  9. c#命名规则参考

    命名规则参考:1.从组件类型名中移去T前缀.例如TButton变成Button.2.除了第一个元音,删去所有元音字母.例如,Button变成bttn,Edit变成edt.3.压缩双字母.例如,bttn ...

  10. In a Web Application and Mobile (hybrid), how to know which this platform running?

    needed depending on the platform to change the CSS to suit the size of the font. for example the DbG ...