题意:求有多少个1~n的排列满足:

其中n<=50

解:

贼神的一道题。

如何处理绝对值?

从小到大按顺序放数,可以拆掉绝对值。

如果你放的旁边有个空隙,那么贡献-i,如果旁边有个数,贡献+i

然后你设的是f[i][j][k][s]表示前i个数,有j+1段数(j个间隔),两端点状态为k(0~2分别表示都没有放数,放了一个,放了两个),目前贡献为s的方案数。

所以要求的就是f[n][0][2][m]

考虑转移:我们可以把i放在某个间隔里,三种情况。还可以放在两端,4种情况。

 #include <cstdio>
#include <algorithm> typedef long long LL;
const int N = , MO = 1e9 + , D = ; int n;
LL f[][N][][]; inline void add(LL &a, const LL &b) {
a += b;
while(a >= MO) {
a -= MO;
}
while(a < ) {
a += MO;
}
return;
} int main() { freopen("wave.in", "r", stdin);
freopen("wave.out", "w", stdout);
int m;
scanf("%d%d", &n, &m); LL ans = ; f[][][][D - ] = ; // 1 in mid
f[][][][D - ] = ; // 1 in edge
for(int i = ; i < n; i++) {
for(int j = ; j <= (n + ) >> ; j++) {
for(int k = ; k < ; k++) {
for(int s = ; s < ; s++) {
if(!f[i & ][j][k][s]) {
continue;
}
LL t = f[i & ][j][k][s];
//printf("%d %d %d %d = %lld\n", i, j, k, s - D, t);
// f[i][j][k][s] -> ?
if(k < ) { // i+1 in edge
add(f[(i + ) & ][j][k + ][s + i + ], t * ( - k)); // merge
add(f[(i + ) & ][j][k][s], t * ( - k)); // edge
add(f[(i + ) & ][j + ][k + ][s - i - ], t * ( - k)); // end
if(j + ( - k) + i < n - ) {
add(f[(i + ) & ][j + ][k][s - ((i + ) << )], t * ( - k)); // split
//printf("%d %d %d %d %d \n", i + 1, j + 1, k, s - ((i + 1) << 1) - D, f[i + 1][j + 1][k][s - ((i + 1) << 1)]);
}
}
// i+1 in mid
if(j) {
add(f[(i + ) & ][j][k][s], t * j * ); // edge
add(f[(i + ) & ][j - ][k][s + ((i + ) << )], t * j); // merge
if(j + ( - k) + i < n - ) { // split
add(f[(i + ) & ][j + ][k][s - ((i + ) << )], t * j);
}
}
f[i & ][j][k][s] = ;
}
}
}
} printf("%lld", f[n & ][][][m + D]);
return ;
}

AC代码

空间不够,要滚动。然后每次要清零。当前价值可能为负所以要加一个偏移量。

相同的套路还有相邻的两个数贡献为max/min,几乎一模一样。

最新文章

  1. 使用WinRar软件制作程序安装包
  2. C/C++编程语言学习资料尽收眼底 电子书+视频教程
  3. 禅道Linux一键安装版
  4. Kali Linux 安装教程-转
  5. Android基础_3 Activity相对布局
  6. RichTextBox返回值标记不同颜色
  7. 【转】 MEF 和 MAF
  8. Qt C++中的关键字explicit——防止隐式转换(也就是Java里的装箱),必须写清楚
  9. [Hapi.js] POST and PUT request payloads
  10. js框架——angular.js(4)
  11. SDL2源代码分析1:初始化(SDL_Init())
  12. linux 大杂烩
  13. Django学习手册 - reverse()反转URL
  14. 【php】php输出jquery的轮询,5秒跳转指定url
  15. openLDAP安装时无法操作根节点数据,提示的是This base cannot be created with PLA.
  16. VS诊断工具打开失败
  17. Luogu3527 POI2011 Meteors 整体二分、树状数组、差分
  18. High-radix routers
  19. mysql面试题目
  20. Spark项目之电商用户行为分析大数据平台之(六)用户访问session分析模块介绍

热门文章

  1. Oracle 备份表数据
  2. Appscanner实验还原code1
  3. dom 事件主要内容
  4. java、二维数组详解!
  5. CS新建排版
  6. Mysql 计划任务
  7. Codeforces1036G Sources and Sinks 【构造】【状态压缩】
  8. 【XSY2708】hack 网络流
  9. bzoj 1083: [SCOI2005]繁忙的都市 (最小生成树)
  10. Jdk1.6编译,1.7执行,1.7中没有需要的类,为何不会报错