2017百度春招 不等式数列(DP)
来源:互联网 发布:邮件软件中文字体 编辑:程序博客网 时间:2024/05/20 16:36
度度熊最近对全排列特别感兴趣,对于1到n的一个排列,度度熊发现可以在中间根据大小关系插入合适的大于和小于符号(即 '>' 和 '<' )使其成为一个合法的不等式数列。但是现在度度熊手中只有k个小于符号即('<'')和n-k-1个大于符号(即'>'),度度熊想知道对于1至n任意的排列中有多少个排列可以使用这些符号使其为合法的不等式数列。
输入描述:
输入包括一行,包含两个整数n和k(k < n ≤ 1000)
输出描述:
输出满足条件的排列数,答案对2017取模。
输入例子:
5 2
输出例子:
66
思路:dp[i][j]表示有i个数字及j个小于号所能组成的数量(即大于号为i-j-1);全排列的生成我们按从1到n递增逐个插入来生成;
当插入第i个数字(即数字也为i)时,分以下四种情况:
1.将i插入当前序列的开头,因为按递增插入,则必然等于同时加入了一个大于号;
2.将i插入当前序列的末尾,因为按递增插入,则必然等于同时加入了一个小于号;
3.将i加入一个小于号之间,假设已经有了1<2了,向中间加入3,会发现变成了1<3>2,等于同时加入了一个大于号;
4.将i加入一个大于号中间,假设已经有了2>1了,向中间加入3,会发现变成了2<3>1,等于同时加入了一个小于号;
所以:dp[i][j]等于以上四种情况之和,第一种:dp[i-1][j](j个小于号未改变);第二种:dp[i-1][j-1](增加了一个小于号故前一个为j-1);
第三种:dp[i-1][j]*j(j个小于号未改变,因为可以在j个小于号中插入故*j);第四种:dp[i-1][j-1]*(i-j-1)(同理,可以在i-j-1个大于号中插入);
合并:dp[i][j] = (dp[i - 1][j - 1] * (i - j) + dp[i - 1][j] * (j + 1)) (注意取模)
代码:
#include <iostream> #include <string.h>int dp[1001][1001]; int main() { int n, k; cin >> n >> k; memset(dp,0,sizeof(dp)); dp[2][0] = 1; dp[2][1] = 1; for (int i = 3; i <= n; ++i) { dp[i][0] = 1; dp[i][i - 1] = 1; } for (int i = 3; i <= n; ++i){ for (int j = 1; j <= i - 2; ++j) { dp[i][j] = (dp[i - 1][j - 1] *(i - j))%2017 + (dp[i - 1][j] *(j + 1))%2017; } } cout << dp[n][k]%2017 << endl; return 0; }
- 2017百度春招 不等式数列(DP)
- 不等式数列 百度2017春招笔试
- 2017百度实习生春招java笔试题 不等式数列
- 百度2017春招笔试真题编程题集合--不等式数列
- 百度2017春招笔试真题编程题集合:不等式数列 [python]
- [百度]不等式数列
- 百度笔试 不等式数列
- 2017百度春季实习生编程题之不等式数列
- 不等式数列 (动态规划)
- 不等式数列
- 不等式数列
- 百度2017春招试题
- 2017百度春招 有趣的排序(map)
- 牛客网 不等式数列
- [编程题] 不等式数列
- 【算法题】不等式数列
- 百度2017春招笔试真题
- 2017百度春招编程题
- Linux下的tar压缩解压缩命令详解
- nginx 基础
- phpcms调取当前栏目的描述及当前栏目的名称
- Spring+Mybatis整合时Caused by: java.lang.IllegalArgumentException错误
- redis命令详解
- 2017百度春招 不等式数列(DP)
- JAVA设计模式初探之适配器模式
- android 跳转activity,清空之前activity栈
- iOS 数组转字符串,字符串拆分数组(有分隔符)
- ButterKnife解决 findViewById频繁调用问题
- 移除HTML5 input在type="number"时的上下小箭头
- 带有webview的activity响应系统返回键的处理
- Spring学习(二)Spring容器简介及创建
- 使用logstash+elasticsearch+kibana快速搭建日志平台