热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

做题记录2021.11.3洛谷P1521逆序对

题目链接近两天都在写一个C的Biginteger类,一直没刷题,今天补一下。解法1.纯暴力解法枚举所有全排列并求其逆序对,即使采用树状数组

题目链接
近两天都在写一个C++的Biginteger类,一直没刷题,今天补一下。
解法1.纯暴力解法  枚举所有全排列并求其逆序对,即使采用树状数组等高效方式求逆序对仍要O(nlogn∗n!)O(nlogn*n!)O(nlognn!),完全不可行。
解法2.动态规划
定义dp[i][j]为前i个数的全排列中逆序对为j的个数。我一开始是考虑最后一个数字,但压根没有思路。
正确方法是:考虑有i-1个数的序列,将第i个数插入,由于它是序列中最大的,所以插入其中最后一个位置,可以新增0个逆序对;插入倒数第二个位置新增1个……以此类推,在最前面可以新增i-1个。(也就是说,最多可以新增i-1个)。
因此,dp[i][j]=dp[i-1]从第j-i-1个到第j个的和。
可以进行一个小小的优化:不难发现当j>(i−1)(i−2)2j>\frac{(i-1)(i-2)}{2}j>2(i1)(i2)时,dp[i-1]从(i−1)(i−2)2\frac{(i-1)(i-2)}{2}2(i1)(i2)到j的部分都是0,因此枚举到前者即可。即
dp[i][j]=∑k=max(0,j−i+1)min(j,cnt(x))dp[i−1][k]dp[i][j]=\sum \limits_{k=max(0,j-i+1)}^{min(j,cnt(x))} dp[i-1][k]dp[i][j]=k=max(0,ji+1)min(j,cnt(x))dp[i1][k],其中cnt(x)定义见以下代码:

#include
#include
#define cnt(x) (((x)*(x-1))/2)
#define MOD 10000
const int M=1001;
using namespace std;
int dp[M][M]={{0},{1,0}};
int main() {int n,k;scanf("%d%d",&n,&k);for(int i&#61;2; i<&#61;n; i&#43;&#43;) dp[i][0]&#61;1;for(int i&#61;2; i<&#61;n; i&#43;&#43;) {for(int j&#61;1; j<&#61;k; j&#43;&#43;) {for(int k&#61;max(0,j-i&#43;1); k<&#61;cnt(i-1)&&k<&#61;j; k&#43;&#43;) {dp[i][j]&#61;(dp[i][j]&#43;dp[i-1][k])%MOD;}}}printf("%d",d[n][k]);return 0;
}

其实做到这里&#xff0c;就不难想到用前缀和优化了。但要注意过程中可能出现负数&#xff0c;为了方便取模&#xff0c;这时就不得不将其调整为正数&#xff0c;而且结果dp[n][k]-dp[n][k-1]仍可能为负数&#xff0c;也需要做调整。

#include
#include
#define cnt(x) (((x)*(x-1))/2)
#define MOD 10000
const int M&#61;1001;
using namespace std;
int dp[M][M]&#61;{{0},{1,0}};
int main() {int n,k;scanf("%d%d",&n,&k);for(int i&#61;2; i<&#61;n; i&#43;&#43;) dp[i][0]&#61;1;for(int i&#61;2; i<&#61;n; i&#43;&#43;) {for(int j&#61;1; j<&#61;k; j&#43;&#43;) {int right&#61;min(cnt(i-1),j);if(j-i&#43;1<&#61;0) dp[i][j]&#61;(dp[i][j-1]&#43;dp[i-1][right])%MOD;else dp[i][j]&#61;(dp[i][j-1]&#43;(dp[i-1][right]-dp[i-1][j-i]&#43;MOD)%MOD)%MOD; //注意负数&#xff01;}}printf("%d",((dp[n][k]-dp[n][k-1])&#43;MOD)%MOD); //注意负数&#xff01;return 0;
}

推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
author-avatar
若我倆有了愛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有