这个题乍一看就应该是DP,再看一眼数据范围,1000.。那就应该是了。然后就向DP的方向想,经过对小数据的计算可以得出,如果我们用f[i][j]来表示前i个数有j个是填了"<"的,那么f[i][j]显然可以表示为f[i][j]+=f[i-1][j]\*(j+1)+f[i-1][j-1] (i-j).

至于原因

1.与f[i-1][j-1]

在这种情况下,由于我们是从前往后去推的,所以当前加入的数一定比前面的都大。那么怎么才能使得其变为前n个有j个<呢?

仔细想一下你就会发现,你把这个数插入任何一个数后面,都必将“形成”一个小于号,但是如果我们插入到一个已经形成小于号的两数之间,则小于号数量就不会改变,因为前i-1个数都比当前的i小,所以一共有i-1个空位,但是又有j-1个空位已经形成<号,所以在这种情况下,前i个数形成的每一个有j-1个<的数列都可以形成(i-1)-(j-1)个新的前i个数中有j个<的数列,于是从f[i-1][j-1]能够推出f[i][j]的一部分为f[i-1][j-1]*((i-1)-(j-1))。

2.与f[i-1][j]

那么刚刚是说明了你加入这个数增加了一个小于号的情况。但如果我不增加呢?

我前i-1个数已经形成了j个<。那么我加入i使其不会增加小于号要怎么做呢?

由于上文我已经说过你把这样的i插入两个之间已经是<号的数之间是不会增加<的数量的。所以这样的空位,每一个形成前i-1数有j个<的数列就有j个这样的空位。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define re register
#define ll long long
#define mo 2015
using namespace std;
int n,k,l,f[][],ans;
int main()
{
cin>>n>>k;
for(re int i=;i<=n;i++)
{
f[i][i-]=;
f[i][]=;
}
for(re int i=;i<=n;i++)
{
for(re int j=;j<i-;j++)
{
f[i][j]+=f[i-][j]*(j+)+f[i-][j-]*(i-j);
f[i][j]%=mo;
}
}
cout<<f[n][k]%mo;
}

【P2401】不等数列(DP)的更多相关文章

  1. luogu P2401 不等数列 |动态规划

    题目描述 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入">"和"<".问在所有排列中,有多少个排列恰好有k个"< ...

  2. 洛谷 P2401 不等数列 题解

    每日一题 day25 打卡 Analysis dp[i][j]=dp[i-1][j-1]*(i-j)+dp[i-1][j]*(j+1); 其中i和j是表示前i个数中有j个小于号,j<=i-1 要 ...

  3. P2401 不等数列

    题目描述 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”.问在所有排列中,有多少个排列恰好有k个“<”.答案对2015取模. 注:1~n的排列指的是1 ...

  4. HUAS 1476 不等数列(DP)

    考虑DP. 如果把转移看出当前位填什么数的话,这样是有后效性的. 如果考虑当前的序列是将1至n依次插入序列中的话. 考虑将i插入1到i-1的序列中,如果插入到<号中或者首部,那么最后就会多出一个 ...

  5. 洛谷P2401 不等数列 题解

    可食用的题目链接 题解: 有题目得:这个题有巧做法而不是暴力模拟.废话 这个题看着像一道dp,因为可以由前一种(数据更小的推出数据更大的)推出后一种. 我们设已经得到了n-1个数的总方法(1~n-1) ...

  6. 洛谷 P2401 不等数列

    其实有两种方法来解这道题# 第一种:找规律(非正经) 一看,这玩意像是个杨辉三角,还左右对称呢 因为新插入一个数$n$,有$n+1$个位置可以选,所以总数就乘$n+1$,对应的$f[n+1][i]$也 ...

  7. 落谷 P2401 不等数列

    题目链接. Solution 状态设计 设 \(f_{i, j}\) 为 \(1\) 到 \(i\) 的排列,其中有 \(j\) 个 \(\text{'<'}\) 的方案数. 状态转移 尝试从 ...

  8. Codevs 4357 不等数列

    不等数列 [题目描述] 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”.问在所有排列中,有多少个排列恰好有k个“<”.答案对2012取模. [输入格式 ...

  9. 模拟赛 Problem 2 不等数列(num.cpp/c/pas)

    Problem 2 不等数列(num.cpp/c/pas) [题目描述] 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”.问在所有排列中,有多少个排列恰好有 ...

随机推荐

  1. linux 复制粘贴

    如果想把文件内的第三行内容黏贴到第十五行: 1.进入你的文件,(处于命令模式,而不是编辑模式) 2.将你的光标移到你的第三行的开头(用方向键) 3,按下v,(你发现切换到可视模式了),按方向键,知道选 ...

  2. java访问权限修饰符,一张图搞清楚

    可横向,纵向进行比较记忆

  3. keycode 大全,javascript 再也不用操心我不知道的keycode了

    keycode    8 = BackSpace BackSpace keycode    9 = Tab Tab keycode   12 = Clear keycode   13 = Enter ...

  4. Android无线测试之—UiAutomator UiDevice API介绍八

    获取包名.开启通知栏.快速设置.获取布局文件的方法 一.包名.通知栏.快速设置.布局文件等相关知识: 1)包名:标示应用的符号,每个应用的名字 2)通知栏:从主界面的顶端向下拉,就可以打开通知栏 3) ...

  5. js原型对象中属性被覆盖(1)

    /**   *@author 程无衣   *@description 关于在原型对象中属性被覆盖   */       function Person(){}       Person.prototy ...

  6. java 序列化的作用

    public class Test { public static String requestUrl = "http://localhost/SpringMvc/test.do" ...

  7. POJ 1860 Currency Exchange【bellman_ford判断是否有正环——基础入门】

    链接: http://poj.org/problem?id=1860 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...

  8. php无法连接mongodb 3.0问题解决

    1 几个常用的role root mongodb最高权限 userAdmin 自己建立的数据库账号管理权限 read 只读权限 readWrite 可读可写 2 遭遇的梗 为数据库建立了账号,php死 ...

  9. Django 请求生命周期【图示】

    Django 请求生命周期

  10. 设置请求timeout超时

    import requests r = requests.get("http://www.cnblogs.com/yoyoketang/", timeout=1) # 设置超时 p ...