luogu P4798 [CEOI2015 Day1]卡尔文球锦标赛 dp 数位dp
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的更多相关文章
- [DP]数位DP总结
数位DP总结 By Wine93 2013.7 1.学习链接 [数位DP] Step by Step http://blog.csdn.net/dslovemz/article/details/ ...
- 数位dp模板 [dp][数位dp]
现在才想到要学数位dp,我是不是很弱 答案是肯定的 以一道自己瞎掰的题为模板 //题: //输入数字n //从0枚举到n,计算这n+1个数中含有两位数a的数的个数 //如12930含有两位数93 #i ...
- 【xsy1611】 数位dp 数位dp
这题是显然的数位$dp$,然而我居然写了一个下午!!! 我们不难想到差分,令$solve(x,y)$表示从第一个数字在区间$[0,x]$,第二个数字在区间$[0,y]$的答案. 不难发现题目中给了你一 ...
- 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 ...
- hdu4352-XHXJ's LIS状压DP+数位DP
(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 题意:传送门 原题目描述在最下面. 在区间内把整数看成一个阿拉伯数字的集合,此集合中最长严格上升子序列的长度为k的个数. 思路: ...
- luogu2657-Windy数题解--数位DP
题目链接 https://www.luogu.org/problemnew/show/P2657 分析 第一道数位DP题,发现有点意思 DP求\([L,R]\)区间内的XXX个数,很套路地想到前缀和, ...
- 浅谈数位DP
在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...
- 数位dp 的简单入门
时间紧张,就不讲那么详细了. 之前一直被深搜代码误解,以为数位dp 其实就是记忆化深搜...(虽说爆搜确实很舒服而且还好想) 但是后来发现数位dp 的标准格式其实是 预处理 + dp ...... 数 ...
- 【距离GDOI:141天】 滚入数位DP的坑
作为博客园的第一篇...我都不知道要写什么了 ... 其实今天很没状态,就当吐槽吧... 嗯,被黄神带去写treap+可持久化线段树,然后在可持久化的删除上面跪了两天,真的是一跪不起.我已经连续多久没 ...
随机推荐
- RESTful API 规范(一)
一,简介 DRF 即Django rest framework 二,rest 规范 1 协议 API 与用户通信,总是使用https协议 2 域名 1) 应尽量将API 部署在域名下(这种情况会存在跨 ...
- CF1292C Xenon's Attack on the Gangs 题解
传送门 题目描述 输入格式 输出格式 题意翻译 给n个结点,n-1条无向边.即一棵树.我们需要给这n-1条边赋上0~ n-2不重复的值.mex(u,v)表示从结点u到结点v经过的边权值中没有出现的最小 ...
- A*算法求K短路模板 POJ 2449
#include<cstdio> #include<queue> #include<cstring> using namespace std; const int ...
- Ticket Game思维题
题目链接 题意: 给你一个n的序列(n=2*k),由数字和?(偶数个)组成,A和B分别操作(B先操作):把?变成一个任意的0-9的数字,如果最后前n/2和后n/2个数字之和相等,则A胜,否则B胜. 分 ...
- POJ2376贪心
题意:数轴上有 n (1<=n<=25000)个闭区间 [ai, bi],选择尽量少的区间覆盖一条指定线段 [1,t](1<=t<=1,000,000).覆盖整点,即[1,2] ...
- 13.Camera摄像机常用属性
选中Main Camera相机,在最右侧的Inspector面板可以看到有Camera组件,该组件下有一些摄像机常用的属性. 1.Clear Flags属性 SkyBox:天空盒(默认效果,场景会有天 ...
- Linux 相关学习内容(不定期更新)
Linux 主要目录 / 根目录,在 linux 下有且只有一个根目录,所有的东西都是从这里开始 /bin 可执行二进制文件的目录,如常用的命令,ls, tar, mv, cat.. /boot 放置 ...
- 题解:2018级算法第一次上机 C1-pair
题目描述 北航2018级软件学院算法分析与设计第一次上机第三题 样例 实现解释 题目类型: 这类题目其实就是典型的递归分析语句形式的问题,也是编译原理课程中语法分析的重要方法之一. 解决方案: 为了解 ...
- MISC学习记录 (一)
A记录 题目 他在看什么视频,好像很好看,不知道是什么网站的. 还好我截取了他的数据包,找呀找. key就是网站名称.格式ctf{key} tip:A记录的第一条. 解题链接 过程 下载解题链接中的文 ...
- MYSQL 之 JDBC(八):增删改查(六)ReflectionUtils
这里在网上找了一份ReflectionUtils package com.litian.jdbc; /** * @author: Li Tian * @contact: litian_cup@163. ...