2017百度春招<不等式排列>

题目:

度度熊最近对全排列特别感兴趣,对于1到n的一个排列,度度熊发现可以在中间根据大小关系插入合适的大于和小于符号(即 ‘>‘ 和 ‘<‘ )使其成为一个合法的不等式数列。但是现在度度熊手中只有k个小于符号即(‘<‘‘)和n-k-1个大于符号(即‘>‘),度度熊想知道对于1至n任意的排列中有多少个排列可以使用这些符号使其为合法的不等式数列。

解析: 动态规划问题

dp[i][j] = (dp[i - 1][j - 1] * (i - j) + dp[i - 1][j] * (j + 1)) % 2017;

dp[i][j]表示有i个数字及j个小于号所能组成的数量(大于号数量当然是i - j - 1次,后面需要使用)

而加入第i + 1个数字时,分以下四种情况:

1.如果将i+1插入当前序列的开头,即有了1<2,加入后成为3>1<2,会发现等于同时加入了一个大于号!(此时可以无视1与2之间的关系,因为i+1>i)

2.如果将i+1插入当前序列末尾,即1<2变成了 1<2<3,会发现等于同时加入了一个小于号! (此时可以无视1与2之间的关系,因为i+1>i)

3.如果将i+1加入一个小于号之间,即已经有 1<2了,向中间加入3,会发现变成了1<3>2,等于同时加入了一个大于号!

4.如果将i+1加入一个大于号中间,即有了2>1,变成了2<3>1,等于同时加入了一个小于号!

综上所述,dp[i][j]等于以上四种情况之和:

dp[i - 1][j]                                     //将i加在开头等于加入一个大于号,即要求i-1个数时已经有了j个小于号

dp[i - 1][j - 1]                               //将i加在末尾等于加入一个小于号,即要求i-1个数时已经有了j-1个小于号

dp[i - 1][j] * j                                //将i加在任意一个小于号之间,等于加入了一个大于号;即要求i-1个数时已经有了j个小于号,每个小于                                                         号都可以进行这样的一次插入

dp[i - 1][j - 1] * (i- j - 1)              //将i加载任意一个大于号之间,等于加入了一个小于号;即要求i-1个数时有了j-1个小于号,而此时共有

(i - 1) - (j - 1)- 1个大于号,每个大于号都要进行一次这样的操作

合并同类项即为

dp[i][j] = (dp[i - 1][j - 1] * (i - j) + dp[i - 1][j] * (j + 1))   取模

#include <bits/stdc++.h>

using namespace std;

int n, k, ans;
int dp[1005][1005];
int main() {
    cin >> n >> k;
    for(int i = 1; i <= n; i++)
        dp[i][0] = 1;
    for(int i = 2; i <= n; i++)
        for(int j = 1; j <= k; j++)
            dp[i][j] = (dp[i - 1][j - 1] * (i - j) + dp[i - 1][j] * (j + 1)) % 2017;
    cout << dp[n][k] % 2017 << endl;
    return 0;
}
时间: 2024-08-28 11:46:35

2017百度春招<不等式排列>的相关文章

2017百度春招&lt;有趣的排序&gt;

题目 度度熊有一个N个数的数组,他想将数组从小到大排好序,但是萌萌的度度熊只会下面这个操作:任取数组中的一个数然后将它放置在数组的最后一个位置.问最少操作多少次可以使得数组从小到大有序? #include<bits/stdc++.h> using namespace std; int main() { int n, i, j; vector<int> a; vector<int> b; cin >> n; for(i=0; i<n; i++){ int

春招备战之排序算法

排序算法: 直接插入排序 希尔排序 选择排序 堆帕西 冒泡排序 快速排序 归并排序 基数排序 计数排序 外排序 排序总结 算法 直接排序算法: 直接排序算法原理:从第二个记录开始,每插入一个记录,先在序列中找到该记录(从后向前)的位置,然后插入该记录(将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止.) 直接插入排序的时间复杂度:O(n^2) 直接插入排序的稳定性:因为每次插

6、工作安排--2017网易春招

[编程题] 工作安排 时间限制:1秒 空间限制:32768K 现在有n位工程师和6项工作(编号为0至5),现在给出每个人能够胜任的工作序号表(用一个字符串表示,比如:045,表示某位工程师能够胜任0号,4号,5号工作).现在需要进行工作安排,每位工程师只能被安排到自己能够胜任的工作当中去,两位工程师不能安排到同一项工作当中去.如果两种工作安排中有一个人被安排在的工作序号不一样就被视为不同的工作安排,现在需要计算出有多少种不同工作安排计划. 输入描述: 输入数据有n+1行: 第一行为工程师人数n(

11、堆砖块--2017网易春招

[编程题] 堆砖块 时间限制:1秒 空间限制:32768K 小易有n块砖块,每一块砖块有一个高度.小易希望利用这些砖块堆砌两座相同高度的塔.为了让问题简单,砖块堆砌就是简单的高度相加,某一块砖只能使用在一座塔中一次.小易现在让能够堆砌出来的两座塔的高度尽量高,小易能否完成呢. 输入描述: 输入包括两行: 第一行为整数n(1 ≤ n ≤ 50),即一共有n块砖块 第二行为n个整数,表示每一块砖块的高度height[i] (1 ≤ height[i] ≤ 500000) 输出描述: 如果小易能堆砌出

12、分饼干--2017网易春招

[编程题] 分饼干 时间限制:1秒 空间限制:32768K 易老师购买了一盒饼干,盒子中一共有k块饼干,但是数字k有些数位变得模糊了,看不清楚数字具体是多少了.易老师需要你帮忙把这k块饼干平分给n个小朋友,易老师保证这盒饼干能平分给n个小朋友.现在你需要计算出k有多少种可能的数值 输入描述: 输入包括两行: 第一行为盒子上的数值k,模糊的数位用X表示,长度小于18(可能有多个模糊的数位) 第二行为小朋友的人数n 输出描述: 输出k可能的数值种数,保证至少为1 输入例子: 999999999999

9、涂棋盘--2017网易春招

[编程题] 涂棋盘 时间限制:1秒 空间限制:32768K 小易有一块n*n的棋盘,棋盘的每一个格子都为黑色或者白色,小易现在要用他喜欢的红色去涂画棋盘.小易会找出棋盘中某一列中拥有相同颜色的最大的区域去涂画,帮助小易算算他会涂画多少个棋格. 输入描述: 输入数据包括n+1行: 第一行为一个整数n(1 ≤ n ≤ 50),即棋盘的大小 接下来的n行每行一个字符串表示第i行棋盘的颜色,'W'表示白色,'B'表示黑色 输出描述: 输出小易会涂画的区域大小 输入例子: 3 BWW BBB BWB 输出

网易2017春招笔试真题编程题集合题解

01 双核处理 题目 一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务.n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间. 输入描述 输入包括两行:第一行为整数n(1 ≤ n ≤ 50)第二行为n个整数lengthi,表示每个任务的长度为length[i]kb,每个数均为1024的倍数. 输出描述输出一个整数,表示最少需

[转载]从春招到秋招,一个本科生的求职之路。

原文:从春招到秋招,一个本科生的求职之路. 自报家门,北理工软件学院本科生. 主要部分: 1.毕业去向选择 2.春招过程 3.暑期实习 4.秋招辛酸路程 5.一点感悟 1.毕业去向选择问题 从大一开始,就决定毕业找工作,方向是有了,但是三年多过去了,到现在才发现,大学期间并没有为这个方向做出太大的努力,这也成为我一个本科生找工作的很大障碍,实践能力严重不足.我的情况是:我决定工作,但是由于高中的思维,太看重学习成绩,成绩搞的很好,虽然有保研资格,但是又不读研,找工作的时候,好的互联网公司不看成绩

阿里春招Android面经

作者:淘萄桃 链接: https://www.jianshu.com/p/a07ccaad832d 本文由作者授权发布. 笔者参加18年阿里春招,有幸最终拿到阿里offer,base杭州,岗位客户端开发.一直忙于其他事情,拿到意向已经过去十多天,在此分享一些关于面试的干货,攒一波RP,回馈社会. 从阿里面试说起,阿里的面试一般采用电话面试的形式.笔者一共参加五轮面试,一面电话面试+在线编程,二面视频面试+在线编程,三面部门boss面试,四面交叉面,五面HR.在此分享五轮面试的大概问题吧,笔者是a