LINK:卡尔文球锦标赛

可以先思考一下合法的序列长什么样子.

可以发现后面的选手可以使用前面出现的编号也可以直接自己新建一个队.

其实有在任意时刻i 序列的mex>max.即要其前缀子序列中1~max的值都要出现过。

对于这种数排名的问题 容易想到是在某一位字典序小于要求的字典序 然后后面的随便放.

可以直接枚举这样的位置然后统计。最后可以统计出有多少个比当前要小的。

后续有一个 可以使用a 还有n个人这个样子的dp.总复杂度 \(n^3\) 期望得分50.

code
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cctype>
#include<queue>
#include<deque>
#include<stack>
#include<cstdlib>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<list>
#include<bitset>
#include<utility>
#include<cmath>
#include<string>
#include<cstring>
#include<map>
#include<set>
#define mod 1000007
#define RE register
#define ll long long
#define putl(x) printf("%lld\n",x)
#define put(x) printf("%d\n",x)
#define put_(x) printf("%d ",x)
#define rep(p,n,i) for(int i=p;i<=n;++i)
#define fep(n,p,i) for(int i=n;i>=p;--i)
#define vep(p,n,i) for(int i=p;i<n;++i)
#define get(x) x=read()
using namespace std;
char *fs,*ft,buf[1<<15];
inline char gc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;RE char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}
return x*f;
}
const int MAXN=10010;
int n;
int a[MAXN],f[MAXN],vis[MAXN];
int ans,cnt;
inline int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline int mul(int x,int y){return (ll)x*y%mod;}
inline int mus(int x,int y){return x-y<0?x-y+mod:x-y;}
inline int calc(int a,int n)
{
rep(1,cnt+n,i)f[i]=0;
f[cnt]=a;int ans=0;
rep(1,n,i)fep(cnt+n,cnt,j)f[j]=add(f[j-1],mul(j,f[j]));
rep(cnt,cnt+n,i)ans=add(ans,f[i]);return ans;
}
signed main()
{
//freopen("1.in","r",stdin);
get(n);int ans=0;
rep(1,n,i)get(a[i]);
rep(1,n,i)
{
if(a[i]>1)ans=add(ans,calc(a[i]-1,n-i));
if(!vis[a[i]])vis[a[i]]=1,++cnt;
}
put(ans+1);return 0;
}

考虑优化。

可以发现这个dp是无法进行优化了 插值还是矩阵乘法什么都不太行.

但是还是存在可以压缩的地方的 考虑两个位置 \(i,j\)dp到了第k位 尽管此时值不同但是可以用的数字是相同的 我们可以将其放在一起。

而且这也极像数位dp.

能用的数字的个数 更简单的方法为 最大值而不是上面代码中的cnt...

上面的压缩过程其实是把最大值相同的放在一起。

设\(f_{i,j,0/1}\)表示dp到了i这位的最大值为j是否存在最高位限制的方案数.

实际上 \(f_{i,j,1}\)这个可以直接省掉 因为可以的知在某一位的 有值且一定为1的只有一个地方。

转移不再赘述比较简单.

code
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cctype>
#include<queue>
#include<deque>
#include<stack>
#include<cstdlib>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<list>
#include<bitset>
#include<utility>
#include<cmath>
#include<string>
#include<cstring>
#include<map>
#include<set>
#define mod 1000007
#define RE register
#define ll long long
#define putl(x) printf("%lld\n",x)
#define put(x) printf("%d\n",x)
#define put_(x) printf("%d ",x)
#define rep(p,n,i) for(int i=p;i<=n;++i)
#define fep(n,p,i) for(int i=n;i>=p;--i)
#define vep(p,n,i) for(int i=p;i<n;++i)
#define get(x) x=read()
using namespace std;
char *fs,*ft,buf[1<<15];
inline char gc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;RE char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}
return x*f;
}
const int MAXN=10010;
int n,u;
int a[MAXN],b[MAXN];
int ans,cnt,mx;
int f[2][MAXN][2];
inline int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline int mul(int x,int y){return (ll)x*y%mod;}
inline int mus(int x,int y){return x-y<0?x-y+mod:x-y;}
int main()
{
//freopen("1.in","r",stdin);
get(n);get(a[1]);
if(n==1){puts("1");return 0;}
f[0][1][1]=1;
rep(2,n,i)
{
u^=1;get(a[i]);
fep(n,1,j)//枚举上一次的决策.
{
f[u][j][0]=f[u][j][1]=0;
if(f[u^1][j][0])
{
f[u][j][0]=add(f[u][j][0],mul(j,f[u^1][j][0]));
f[u][j+1][0]=add(f[u][j+1][0],f[u^1][j][0]);
}
if(f[u^1][j][1])
{
f[u][j][0]=add(f[u][j][0],mul(a[i]-1,f[u^1][j][1]));
if(a[i]==j+1)f[u][j+1][1]=add(f[u][j+1][1],f[u^1][j][1]);
else f[u][j][1]=add(f[u][j][1],f[u^1][j][1]);
}
}
}
rep(1,n,j)ans=add(ans,add(f[u][j][1],f[u][j][0]));
put(ans);return 0;
}

luogu P4798 [CEOI2015 Day1]卡尔文球锦标赛 dp 数位dp的更多相关文章

  1. [DP]数位DP总结

     数位DP总结 By Wine93 2013.7 1.学习链接 [数位DP] Step by Step   http://blog.csdn.net/dslovemz/article/details/ ...

  2. 数位dp模板 [dp][数位dp]

    现在才想到要学数位dp,我是不是很弱 答案是肯定的 以一道自己瞎掰的题为模板 //题: //输入数字n //从0枚举到n,计算这n+1个数中含有两位数a的数的个数 //如12930含有两位数93 #i ...

  3. 【xsy1611】 数位dp 数位dp

    这题是显然的数位$dp$,然而我居然写了一个下午!!! 我们不难想到差分,令$solve(x,y)$表示从第一个数字在区间$[0,x]$,第二个数字在区间$[0,y]$的答案. 不难发现题目中给了你一 ...

  4. Codeforces Round #235 (Div. 2) D. Roman and Numbers 状压dp+数位dp

    题目链接: http://codeforces.com/problemset/problem/401/D D. Roman and Numbers time limit per test4 secon ...

  5. hdu4352-XHXJ's LIS状压DP+数位DP

    (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 题意:传送门  原题目描述在最下面.  在区间内把整数看成一个阿拉伯数字的集合,此集合中最长严格上升子序列的长度为k的个数. 思路: ...

  6. luogu2657-Windy数题解--数位DP

    题目链接 https://www.luogu.org/problemnew/show/P2657 分析 第一道数位DP题,发现有点意思 DP求\([L,R]\)区间内的XXX个数,很套路地想到前缀和, ...

  7. 浅谈数位DP

    在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...

  8. 数位dp 的简单入门

    时间紧张,就不讲那么详细了. 之前一直被深搜代码误解,以为数位dp 其实就是记忆化深搜...(虽说爆搜确实很舒服而且还好想) 但是后来发现数位dp 的标准格式其实是 预处理 + dp ...... 数 ...

  9. 【距离GDOI:141天】 滚入数位DP的坑

    作为博客园的第一篇...我都不知道要写什么了 ... 其实今天很没状态,就当吐槽吧... 嗯,被黄神带去写treap+可持久化线段树,然后在可持久化的删除上面跪了两天,真的是一跪不起.我已经连续多久没 ...

随机推荐

  1. (二)ELK Filebeat简介

    Filebeat简介   轻量级的日志传输工具,是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并且 ...

  2. JavaScript图形实例:Hilbert曲线

    德国数学家David Hilbert在1891年构造了一种曲线,首先把一个正方形等分成四个小正方形,依次从西北角的正方形中心出发往南到西南正方形中心,再往东到东南角的正方形中心,再往北到东北角正方形中 ...

  3. 蒲公英 · JELLY技术周刊 Vol.13 跟 VSCode 学习如何开发大型 IDE 项目

    开发一个 IDE 很难么?这或许是件很难的事情,但当我们参考 VSCode 的技术构架来看,整个开发流程就会平滑顺畅很多,从内核开发.代码编辑器.视图结构到插件系统,在这整个技术构架中我们可以看到很多 ...

  4. 数据可视化之powerBI技巧(二)Power BI性能分析器,原来还有这个功能

    ​性能分析器是Power BI前几个月推出的功能,主要用于检测视觉对象和DAX的性能如何,该功能的使用比较简单,首先勾选这个功能, 然后点击开始记录并刷新视觉对象,就可以看出每个元素耗费的时间,如下图 ...

  5. Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览

    当大潮退去,才知道谁在裸泳..关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.MyBatis. ...

  6. ffmpeg播放器实现详解 - 框架搭建

    ffplay是ffmpeg源码中一个自带的开源播放器实例,同时支持本地视频文件的播放以及在线流媒体播放,功能非常强大. FFplay: FFplay is a very simple and port ...

  7. JVM详解之:运行时常量池

    目录 简介 class文件中的常量池 运行时常量池 静态常量详解 String常量 数字常量 符号引用详解 String Pool字符串常量池 总结 简介 JVM在运行的时候会对class文件进行加载 ...

  8. As 布局文件太多很乱的问题

    //添加自定义文件整理文件夹的方法,没有之一在build.gradle(Module: app)里加入布局需要放入的路径代码>>>>>> sourceSets { ...

  9. Java应用服务器之tomcat基础配置(二)

    前文我们聊了下tomcat的配置文件相关格式和组件简介以及webapp目录结构,manger部署和host managera部署,回顾请参考https://www.cnblogs.com/qiuhom ...

  10. PagedList分页,如何添加action参数

    使用PagedList分页,如 @Html.PagedListPager((IPagedList)Model, page => Url.Action("Index", new ...