51nod 1020 逆序排列 DP
- 第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)
- 第2 - T + 1行:每行2个数n,k。中间用空格分隔。(2 <= n <= 1000, 0 <= k <= 20000)
- 共T行,对应逆序排列的数量 Mod (10^9 + 7)
- 1
- 4 3
- 6
思路:
设dp[i][j]表示1-i的全排列中逆序数为j的个数。试想,假如一直dp[i-1]的每一种状态,那么和dp[i]有什么关系。
不难得出,对于已知的dp[i-1]的基础上,插入i就可以得到dp[i]。但是i的位置放置的不同,就影响了dp[i]的每一项。
列出i取值1,2,3,4的每一项,可以得出一个关系式:
得到这个关系式其实这道题目已经可以做了,利用前缀和优化,但是还可以更进一步
同理有:
此时假设k可以取到0,实际上max在这里只是优化
则可以得到:
最后需要注意相减可能为负数,需要加上mod再取mod
代码:
- #include <stdio.h>
- const int mod=;
- int dp[][];
- void init() {
- for(int i=;i<=;++i) {
- dp[i][]=;
- }
- for(int i=;i<=;++i) {
- int maxval=i*(i-)>>;
- for(int j=;j<=maxval&&j<=;++j) {
- int temp=;
- if(j>=i) temp=dp[i-][j-i];
- dp[i][j]=((dp[i][j-]+dp[i-][j]-temp)%mod+mod)%mod;
- }
- }
- }
- int main() {
- init();
- int T,n,k;
- scanf("%d",&T);
- while(T--) {
- scanf("%d %d",&n,&k);
- printf("%d\n",dp[n][k]);
- }
- return ;
- }
51nod 1020 逆序排列 DP的更多相关文章
- 51nod 1020 逆序排列——dp
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序 ...
- 51nod 1020 逆序排列 递推DP
1020 逆序排列 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么 ...
- 1020 逆序排列(DP)
1020 逆序排列 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序 ...
- 51nod 1020 逆序排列(dp,递推)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1020 题意:是中文题. 题解:很显然要设dp[i][j]表示 ...
- 51nod 1020 逆序排列
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1020 题意: 思路: 一开始用了三重循环... 设f(n,k)表示n个数 ...
- 51 Nod 1020 逆序排列
1020 逆序排列 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么 ...
- 【题解】逆序排列 [51nod1020]
[题解]逆序排列 [51nod1020] 传送门:逆序排列 \([51nod1020]\) [题目描述] 共 \(T\) 组测试点,每一组给出 \(2\) 个整数 \(n\) 和 \(k\),在 \( ...
- SQL-27 给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。 提示:在sqlite中获取datetime时间对应的年份函数为strftime('%Y', to_date)
题目描述 给出每个员工每年薪水涨幅超过5000的员工编号emp_no.薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列. 提示:在s ...
- SQL-15 查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列
题目描述 查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列CREATE TABLE `employees` (`emp_no ...
随机推荐
- 大道至简第一章读后感Java伪代码
//一.愚公移山 /*原始需求 惩山北直塞,出入之迁也. 项目沟通的方式 聚室而谋 项目目标 毕力平险,指通豫南,达于汉阴 人员组成 愚公,子孙荷担者三夫,邻人遗男 技术方案 叩石垦壤 簸萁运与渤海之 ...
- java swing中Timer类的学习
最近在完成学校课程的java平时作业,要实现一个计时器,包含开始.暂停以及重置三个功能.由于老师规定要用这个timer类,也就去学习了一下,顺便记录一下. 首先呢去查了一下java手册上的东西,发现t ...
- JDBC的基本用法
一.编程步骤 1.加载驱动 Class forName("com.mysql.jdbc.Driver"):mysql驱动 Class forName("oralce.jd ...
- inline的C99标准相关原文
WG14/N1256 Annex J (informative) Portability issues J.1 Unspecified behavior Whether a call to an in ...
- Android O --Soong Build
Concept: Kati (https://android.googlesource.com/platform/build/kati/) - Reads Android.mk files -> ...
- java Callable创建线程
package com.java.concurrent; import java.util.concurrent.Callable; import java.util.concurrent.Execu ...
- Android 开发笔记___EditText__文本编辑框
常用属性: inputType:(代码中:setiputtype)设置输入类型,多种类型中间用"|" maxlength:最大长度,无法通过代码设置 hint:提示文本内容,(代码 ...
- mongodb集群【】
参考 http://www.jianshu.com/p/2825a66d6aed http://www.cnblogs.com/huangxincheng/archive/2012/03/07/238 ...
- arguments对象
改变函数arguments也会改变对应的参数,arguments会自动映射到对应的参数上 但是改变参数并不会同步改变arguments 它们并不公用内存 在strict模式,不能对arguments付 ...
- Problem B: 农夫果园 简单点,出题的方式简单点
我走过最长的路,就是教主的套路#include <iostream> #include <string> using namespace std; class Fruit { ...