博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod 1020 逆序排列(dp,递推)
阅读量:5316 次
发布时间:2019-06-14

本文共 1423 字,大约阅读时间需要 4 分钟。

题目链接:

题意:是中文题。

 

题解:很显然要设dp[i][j]表示,i个数有j个逆序对有几种然后就是状态的转移,

dp[i][j]=dp[i-1][max(0,j-(i-1)]+.....+dp[i-1][max(j,(i-1)*(i-2)/2];

还会用到前缀和,还有注意最后结果加mod再膜mod,结果可能会负数。

#include 
#include
#include
#include
#define mod 1000000007using namespace std;typedef long long ll;int sum[1000000] , dp[1010][30010];int main() { int t; memset(dp , 0 , sizeof(dp)); dp[1][0] = 1; dp[2][0] = 1 , dp[2][1] = 1 , sum[0] = 1 , sum[1] = 2; for(int i = 3 ; i <= 1000 ; i++) { for(int j = 0 ; j <= i * (i - 1) / 2 && j <= 30000 ; j++) { if(j == 0) { dp[i][j] = 1; } else { int gg = (i - 2) * (i - 1) / 2; if(j - (i - 1) <= 0) { dp[i][j] = sum[min(gg , j)]; } else { dp[i][j] = sum[min(gg , j)] - sum[j - (i - 1) - 1]; } dp[i][j] = dp[i][j] % mod; } } for(int j = 0 ; j <= i * (i - 1) / 2 && j <= 30000 ; j++) { if(j == 0) sum[j] = 1; else sum[j] = sum[j - 1] % mod + dp[i][j] % mod; sum[j] = sum[j] % mod; } } scanf("%d" , &t); while(t--) { int n , m; scanf("%d%d" , &n , &m); printf("%d\n" , (dp[n][m] + mod) % mod); } return 0;}

转载于:https://www.cnblogs.com/TnT2333333/p/6863389.html

你可能感兴趣的文章
diff和patch工具使用(转)
查看>>
【agc004f】Namori Grundy
查看>>
算法61---两个字符串的最小ASCII删除和【动态规划】
查看>>
JAVA多线程之先行发生原则
查看>>
uWSGI基础攻略
查看>>
Java异常处理教程
查看>>
内置数据类型
查看>>
一些部署django用到的linux命令
查看>>
#if defined(__cplusplus)
查看>>
018.Zabbix维护时间和模板导入
查看>>
Apache并发处理模块
查看>>
Servlet异常
查看>>
菜鸟学习MVC实录:弄清项目各类库的作用和用法
查看>>
day32
查看>>
Binding在WPF中的使用
查看>>
软件测试技术第二次作业——程序错误的判断
查看>>
【啊哈!算法】之二、插入排序
查看>>
workaround for %33 texture memory bug
查看>>
2.2 PostgreSQL 概念
查看>>
2.6. PostgreSQL表之间连接
查看>>