[BZOJ 2817] 波浪
Link:
Solution:
算是比较神的DP了吧,
首先这个绝对值处理起来很难受,肯定要想办法去掉
于是想到从小到大插入的方式,便不存在绝对值的问题了
插入一个数只有5种情况,我们来分类讨论:
1.插入以后它两边都没有数。(权值$-2*i$,方案数$k+1-l$)
2.插入以后它两边都有数。(权值$2*i$,方案数$k-1$)
3.插入以后它的一边有数。(权值$0$,方案数$k*2-l$)
4.插入在边界上,且它旁边没有数。(权值$-i$,方案数$2-l$)
5.插入在边界上,且它旁边有数。(权值$i$,方案数$2-l$)
可以发现每种情况产生的权值都可以确定,且方案数也可以确定,于是想到便能使用DP转移啦
设$f[i][j][k][l]$表示当前插入$i$个数,权值为$j$,序列被分为$k$段,序列两端状态为$l$时的方案数
$l$表示序列两端是有0/1/2个数
接下来就是巨恶心的高精度处理了:
手写高精度速度肯定是不够的,
于是只能用正式OI不给用的黑科技__float128了,(讲道理是不能用的,但不管A了就行)
能保留小数点后32位,整数位能表示到1e4392?超乎我的想象
(注意输出时要手动处理一下)
但这还不够,$k<=8$时还是TLE,
于是还要将输入分类,如果$k<=8$用double,否则才用__float128
学会使用Template和namespace来进行不同处理
Code:
#include <bits/stdc++.h> using namespace std;
#define ll long long
#define RG register
const int M=4500; namespace db{double f[2][2*M+1][101][3];}
namespace f128{__float128 f[2][2*M+1][101][3];}
int n,m,k; template<class T> inline void print(T res)
{
printf("%d.",(int)res); //逐位输出
while(k--)
{
res=(res-(int)res)*10;
if(!k) res+=0.5;
printf("%d",(int)res);
}
} template<class T> inline void solve(T f[2][2*M+1][101][3])
{
f[1][M-1][1][1]=2;f[1][M-2][1][0]=1;f[0][M][1][2]=1;
for(RG int i=2,cur=0,pre=1;i<=n;++i,pre=cur,cur^=1)
{
memset(f[cur],0,sizeof(f[cur]));
for(RG int j=0;j<=2*M;++j)
for(RG int k=1;k<=n-1;++k)
for(RG int l=0;l<=2;++l)
{
if(!f[pre][j][k][l]) continue;
if(j+2*i<=2*M) f[cur][j+2*i][k-1][l]+=f[pre][j][k][l]*(k-1);
if(j>=2*i) f[cur][j-2*i][k+1][l]+=f[pre][j][k][l]*(k+1-l);
f[cur][j][k][l]+=f[pre][j][k][l]*(k*2-l);
if(l<2)
{
if(j+i<=2*M) f[cur][j+i][k][l+1]+=f[pre][j][k][l]*(2-l);
if(j>=i) f[cur][j-i][k+1][l+1]+=f[pre][j][k][l]*(2-l);
}
}
} T res=0;
for(RG int i=M+m;i<=2*M;++i) res+=f[n&1][i][1][2];
for(RG int i=2;i<=n;++i) res/=i;
print(res);
} int main()
{
cin >> n >> m >> k;
if(k<=8) solve(db::f);
else solve(f128::f);
return 0;
}
Review:
1、通过排序的预处理规避绝对值运算
2、DP时对边界条件加一个特殊状态
3、对__float128的使用(输出要特殊处理)
4、使用Template+namespace等方法提高代码重用性
[BZOJ 2817] 波浪的更多相关文章
- bzoj2817[ZJOI2012]波浪
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2817 波浪 [问题描述] 阿米巴和小强是好朋友. 阿米巴和小强在大海旁边看海水的波涛.小 ...
- 【BZOJ2817】[ZJOI2012]波浪(动态规划)
[BZOJ2817][ZJOI2012]波浪(动态规划) 题面 BZOJ 洛谷 题解 首先这个差值最大也就是\(n^2\)级别的. 那么这样子就可以压进状态啦. 我们把这个操作看成一个个加数的操作,按 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- HTML5 Canvas玩转酷炫大波浪进度图
如上图所见,本文就是要实现上面那种效果. 由于最近AlloyTouch要写一个下拉刷新的酷炫loading效果.所以首选大波浪进度图. 首先要封装一下大波浪图片进度组件.基本的原理是利用Canvas绘 ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
随机推荐
- 【TMD模拟赛】上低音号 链表
这道题一看有两个出发现点,一枚举点去找边界,想了一会就Pass了...,二是枚举相框,我们最起码枚举两个边界,然后发现平行边界更好处理,然而仍然只有30分,这个时候就来到了链表的神奇应用,我们枚举上界 ...
- BZOJ1875: [SDOI2009]HH去散步 图上边矩乘
这道题十分的坑…… 我作为一只连矩乘都不太会的渣渣看到这道题就只能神搜了….. 首先说一下普通的矩乘求方案,就是高出邻接矩阵然后一顿快速幂….. 矩乘一般就是一些秘制递推….. 再说一下这道题,我们可 ...
- taotao用户登录(及登录成功后的回调url处理)
后台Controller: package com.taotao.sso.controller; import org.springframework.stereotype.Controller; i ...
- codeforces B. Okabe and Banana Trees 结论题
题目传送门 这道题 枚举一波y就好了 要求x,y整数 所以y最多1000个 然后算一波答案更新就好了 233 #include<cstdio> #include<cstring> ...
- 为什么VS没有提供平win64程序编写项
最近在学习C++和MFC编程,突然有个疑问,为什么每次新建项目时,都只有win32 console application,从来没见过win64的选项,于是去网上查了查,下面是我找到的几个答案: 作者 ...
- 基于 Windows 7 的计算机的可用内存可能低于安装内存
https://support.microsoft.com/zh-cn/kb/978610 症状 在运行 Windows 7 的计算机上,可用内存 (RAM) 可能会低于安装内存. 例如,32 位版本 ...
- Swift “ambiguous use of operator '>'”
http://stackoverflow.com/questions/25458548/swift-ambiguous-use-of-operator 3down votefavorite I h ...
- [ Openstack ] OpenStack-Mitaka 高可用之 认证服务(keystone)
目录 Openstack-Mitaka 高可用之 概述 Openstack-Mitaka 高可用之 环境初始化 Openstack-Mitaka 高可用之 Mariadb-Galera集群 ...
- 【 Linux 】为lnmp架构添加memcached支持
一.首先搭建lnmp平台,这里不再演示.通过php页面来进行测试如下: [root@node1 ~]# vim /usr/local/nginx/html/info.php <?php $lin ...
- 【SQL】约束与触发器2
3.修改约束 3.1给约束命名 按如下格式命名: name ) CONSTRAINT NameIsKey PRIMARY KEY gender ) CONSTRAINT NoAndro CHECK ( ...