博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj1925】地精部落[SDOI2010](dp)
阅读量:6086 次
发布时间:2019-06-20

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

  题目传送门:

  这道题,,,首先可以一眼看出他是要我们求由1~n的排列组成,并且抖来抖去的序列的方案数。然后再看一眼数据范围,,,似乎是O(n^2)的dp?然后各种撕烤,,,然而还是不会。。。

  对于这道题,我第一眼的想法是用f[i][j]表示长度为i,最后一个数是j的抖动序列的方案数,然而这是个1~n的排列,似乎没法解决数字重复的问题。。QAQ

  于是看了一波题解,,,原来这个dp是这样子搞的:用f[i][j]表示i个数的排列、第一个数<=j且开头下降的抖动序列的方案数。

  然后dp方程就变成了这样:f[i][j]=f[i][j-1]+f[i-1][i-j]。。。

  当开头的数<j(也就是<=j-1)时,抖动序列的方案数显然=f[i][j-1];

  当开头的数=j 时,我萌尝试把开头的j删掉,然后再把剩下>j的数统统-1,于是我们就会发现,这时的方案和i-1个数的排列、第一个数<=j-1(因为原序列开头是j,并且开头下降要求原序列的第二个数比j小)且开头上升的抖动序列的方案一一对应。然而这里的开头上升怎么算呢?其实我们发现把一个长度为n、开头下降的序列a[i]的每一位转变为n-a[i]+1,它就变成了一个长度为n、开头上升的抖动序列。所以这时的方案数就=f[i-1][i-j];

  所以就可以愉快的dp辣!

代码:

#include
#include
#include
#include
#include
using namespace std;int f[2][4210]={
0};int n,mod;int main(){ int i,j; scanf("%d%d",&n,&mod); f[1][1]=1; for(i=2;i<=n;i++) for(j=1;j<=i;j++) f[i&1][j]=(f[i&1][j-1]+f[(i&1)^1][i-j])%mod; printf("%d\n",f[n&1][n]*2%mod);}
短得让人心头一震

 =========================================2017.8.29更新线=============================================

  首先感谢楼下评论@happy_codes。

  我看了评论,发现上面的说法确实有点问题,我自己也不知道怎么解释,网上的题解(我目前找到的)也没有说明。这个问题就是:如果(i-1)-x+1<=j-1那么应该得出x>=i-j+1,然而我并不知道为什么这样写答案是对的。。。

  但是我还想到了一种写法,f[i][j]表示i个数的排列,第一个数=j且开头下降的方案数,并且用g数组来表示f数组的前缀和:g[i][j]=sigma(f[i-1][k]) (1<=k<=j),然后仿照上面的方法就能列出dp方程

代码:

#include
#include
#include
#include
#include
using namespace std;int f[2][4210]={
0},g[2][4210]={
0};int n,mod;int main(){ int i,j; scanf("%d%d",&n,&mod); f[1][1]=1; for(i=1;i<=n;i++)g[1][i]=1; for(i=2;i<=n;i++) for(j=1;j<=i;j++){ f[i&1][j]=(g[(i&1)^1][i-1]-g[(i&1)^1][i-j]+mod)%mod; g[i&1][j]=(g[i&1][j-1]+f[i&1][j])%mod; } printf("%d\n",g[n&1][n]*2%mod);}
View Code

 

转载于:https://www.cnblogs.com/quzhizhou/p/7236727.html

你可能感兴趣的文章
Java 集合深入理解(7):ArrayList
查看>>
2019年春季学期第四周作业
查看>>
linux环境配置
查看>>
tomcat指定配置文件路径方法
查看>>
linux下查看各硬件型号
查看>>
epoll的lt和et模式的实验
查看>>
Flux OOM实例
查看>>
07-k8s-dns
查看>>
Android 中 ListView 分页加载数据
查看>>
oracle启动报错:ORA-00845: MEMORY_TARGET not supported on this system
查看>>
Go方法
查看>>
Dapper丶DapperExtention,以及AbpDapper之间的关系,
查看>>
搞IT的同学们,你们在哪个等级__那些年发过的帖子
查看>>
且谈语音搜索
查看>>
MySQL数据库导入导出常用命令
查看>>
低版本Samba无法挂载
查看>>
Telegraf+Influxdb+Grafana构建监控平台
查看>>
使用excel 展现数据库内容
查看>>
C#方法拓展
查看>>
MySql.Data.dll的版本
查看>>