本人水平有限,题解不到为处,请多多谅解

本蒟蒻谢谢大家观看

题目:

            permut
题目描述:
求由 1 到 n 一共 n 个数字组成的所有排列中,逆序对个数为 k 的有多少个
输入格式
第一行为一个整数 T,为数据组数。
以下 T 行,每行两个整数 n,k,意义如题目所述。
输出格式
对每组数据输出答案对 10000 取模后的结果
Sample Input
1
4 1
Sample Output
数据范围及约定
对于 30% 的数据,满足 n≤12
对于所有数据,满足 n≤1000, k≤1000,T≤10
测试时全程开启O2优化
此题为逆序对:逆序对定义如下:
设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。

如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数。
首先看一下题面:由1~n组成的所有排列中,求逆序对个数等于k的排列数
我首先想到的是用全排列,不断去枚举用dfs去爆搜,(结果只拿了20分)解法如下:
#include<bits/stdc++.h>
#pragma GCC optimize(3)
#define mod 10000
using namespace std;
int n,a[13],ans,cnt,t,k;
int f[1001][20002];
bool b[13];
void inint(){freopen("permut.in","r",stdin);freopen("permut.out","w",stdout);
}
void dfs(int num){if(num==n+1){cnt=0;//cnt每次做完一次排列后要清零,从重新统计 for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(a[i]>a[j]&&j>i)cnt++;    }//cout<<a[i]<<" ";//"  cnt= "<<cnt<<" ";
        }//cout<<endl;if(cnt==k)ans++;//cout<<endl;//cout<<ans<<endl;return ;}
//    cout<<ans<<endl;for(int i=1;i<=n;i++){if(b[i]==false){b[i]=true;a[num]=i;dfs(num+1);b[i]=0;a[num]=0;}}return ;
}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
}
int main()
{//inint();t=read();while(t--){ans=0;n=read(),k=read();dfs(1);printf("%d\n",ans);} return 0;
}

同理:ans一定要不断的重新清零。

显然解法1会TLE,当n==10是其已经不能胜任在1s内跑完。

这时,通过dfs我们可以输入几个数,发现可以使用DP(dfs在一定有规律时可以转化成DP)

解法2横空出世:设f[i][j]表示1~i的逆序对数为j的排列方案数。次设法刚好符合题意,我们就可以直接输出f[n][k]即可。

在任意一个1到i-1排列中插入i可能产生0,1,2……i-1个逆序对。

   i-1  

f[i][j]=∑f[i-1][j-k](j>=k)

   k=0

因为有多组数据,所以枚举时n,k都要取max,来优化时间复杂度,其n,k都要用数组形式存储,防止数据更新。
code:

#include<bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
int f[5001][4951],n[11],k[11],t,maxn,maxk;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
}
int main()
{t=read();for(int i=1;i<=t;i++){n[i]=read(),k[i]=read();maxn=max(maxn,n[i]);maxk=max(maxk,k[i]);}f[0][0]=1;f[1][0]=1;f[2][0]=1;f[2][1]=1;for(int i=3;i<=maxn;i++){for(int j=0;j<=maxk;j++){for(int kk=0;kk<=i-1&&kk<=j;kk++){f[i][j]=(f[i][j]+f[i-1][j-kk])%10000;}}}for(int i=1;i<=t;i++)printf("%d\n",f[n[i]][k[i]]);
} 

转载于:https://www.cnblogs.com/nlyzl/p/11352534.html

队测 逆序对 permut相关推荐

  1. Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB Submit: 1539  Solved: 665 [Submit][Status][ ...

  2. 队内胡策 2017.10.24 求逆序对+表达式计算+贪心+Bfs+最短路、exgcd

    *PS:为什么我t5死活都调不出来呢(눈‸눈) T1:原创,参考noip火柴排队. T2: codevs 2178 表达式运算Cuties (我自己找的) T3:Codeforce867E(865D) ...

  3. 剑指Offer - 面试题51. 数组中的逆序对(归并排序,求逆序对)

    1. 题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5限制: 0 ...

  4. 算法笔记【归并排序】:逆序对

    Problem F. Ricky队形 时间限制 1000 ms 内存限制 256 MB 题目描述 Ricky班里有n(2<=n<=100000)个人,每个人有一个学号ai(1<=ai ...

  5. 1164: 分治 逆序对

    1164: 分治 逆序对 时间限制: 1 Sec  内存限制: 128 MB 题目描述 给一列数a1,a2,...,an,求它的逆序对数,即有多少个有序对(i,j),使得i<j且ai>aj ...

  6. 【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅

    这是我悲惨的接近爆零的一次考试,但是本蒟蒻不能放弃,还是要总结的QAQ 答题卡 [题目背景] 八月是个悲惨的月份.先不谈炎热的天气,对于新生来说,八月意味着军训: 而对于高二高三的同学来说,八月意味着 ...

  7. 【逆序对】Ultra - Quicksort

    POJ 2299 Ultra-QuickSort 只允许交换,比较相邻的元素, 求最少多少次交换可以使得序列有序 冒泡排序的次数-->数列中逆序对的个数减1-->最终为0 -->答案 ...

  8. UVA 11990 ``Dynamic'' Inversion 动态逆序对

    ``Dynamic'' Inversion Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/index ...

  9. 期望dp ---- B. Tree Array 思维+期望dp 逆序对期望数

    题目大意 题目大意: n(n≤200)n(n\leq200)n(n≤200)个节点的树.初始的时候,等概率随机选择一个点标记,接来随机选择一个与标记点相连的未标记点来标记,直到所有的点都被标记.根据点 ...

最新文章

  1. Cisco ***学习笔记--第二天
  2. 我放弃了年薪200万的岗位,因为“复制粘贴”的技术活让人厌恶
  3. 第五章 Python数据结构
  4. vscode怎么设置默认浏览器?(不成功)
  5. 第03课:Anaconda 与 Jupyter Notebook
  6. 无参考质量评估在视频增强的进展与应用
  7. Spring-Cloud 学习笔记-(4)负载均衡器Ribbon
  8. 6-14 数据库高级
  9. 使用XAMPP和Hbuilder搭建PHP环境(XAMPP中Apache启动失败解决方法)
  10. pythonweb静态服务器_python实现外部静态服务器,浏览器通过HTTP与之通信2
  11. Tengine编译安装+lua+sticky模块
  12. springboot 集成redis实现session共享
  13. 用c语言判断计算机是大端模式还是小端模式
  14. 芯片AD库转换之贸泽 Library Loader使用
  15. 【07】processing-字体(中文)
  16. Android请求麦克风权限+系统权限页面回调
  17. 机器学习/深度学习算法学习心得
  18. 优雅写代码的45个小技巧
  19. C语言:利用指针编写程序,用梯形法计算给定的定积分
  20. C语言消消乐游戏代码

热门文章

  1. MySQL数据恢复(通过.frm和.idb文件)
  2. 18-三目运算符和逗号表达式
  3. centos英文版下如何安装中文语言
  4. WinDbg 命令学习 - !list
  5. 你也可以看懂,量子力学的困惑,测不准原理 薛定谔的猫 !
  6. 电源输出电压纹波及电流纹波测试步骤
  7. WPS设置Excel下拉选项
  8. C语言之strcat函数
  9. java导出excel插入图片
  10. 22考研经验贴-这是可以说的吗?