【bzoj1925】地精部落[SDOI2010](dp)
题目传送门:1925: [Sdoi2010]地精部落
这道题,,,首先可以一眼看出他是要我们求由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<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
int f[][]={};
int n,mod;
int main()
{
int i,j;
scanf("%d%d",&n,&mod);
f[][]=;
for(i=;i<=n;i++)
for(j=;j<=i;j++)
f[i&][j]=(f[i&][j-]+f[(i&)^][i-j])%mod;
printf("%d\n",f[n&][n]*%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<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
int f[][]={},g[][]={};
int n,mod;
int main()
{
int i,j;
scanf("%d%d",&n,&mod);
f[][]=;
for(i=;i<=n;i++)g[][i]=;
for(i=;i<=n;i++)
for(j=;j<=i;j++){
f[i&][j]=(g[(i&)^][i-]-g[(i&)^][i-j]+mod)%mod;
g[i&][j]=(g[i&][j-]+f[i&][j])%mod;
}
printf("%d\n",g[n&][n]*%mod);
}
【bzoj1925】地精部落[SDOI2010](dp)的更多相关文章
- BZOJ-1925 地精部落 烧脑DP+滚动数组
1925: [Sdoi2010]地精部落 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1053 Solved: 633 [Submit][Status ...
- 【BZOJ1925】[Sdoi2010]地精部落 组合数+DP
[BZOJ1925][Sdoi2010]地精部落 Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从 ...
- bzoj1925 [Sdoi2010] 地精部落【DP】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1925 一个多月前“过”了这道题,还自欺欺人地认为懂了这道题,这直接导致了昨晚多校联测2的T3 ...
- bzoj1925 地精部落
神题! 地精部落 内存限制:128 MiB 时间限制:1000 ms 标准输入输出 题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度 ...
- 【bzoj1925】[Sdoi2010]地精部落 组合数学+dp
题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi,其中Hi是1到 ...
- BZOJ1925 [Sdoi2010]地精部落 【dp】
题目 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi,其中Hi是1到N ...
- 2018.10.20 bzoj1925: [Sdoi2010]地精部落(dp)
传送门 dp好题. 设f[i][j]f[i][j]f[i][j]表示iii个数结尾是jjj且结尾两个数递增的方案数. 那么显然可以对称的定义出g[i][j]g[i][j]g[i][j]表示iii个数结 ...
- bzoj 1925 [Sdoi2010]地精部落(DP)
Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi, ...
- P2467 [SDOI2010]地精部落 (dp+组合数)【扩展Lucas好难不会】
题目链接:传送门 题目: 题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为N的山脉H可分为从左到右的N段,每段有一个独一无二的高度Hi,其 ...
随机推荐
- CGAffineTransform函数旋转操作
本文转载至 http://blog.sina.com.cn/s/blog_923fdd9b0101ahyx.html 首先获取UITableView的CGAffineTransform函数:CG ...
- Android开发:《Gradle Recipes for Android》阅读笔记1.5
这节讲的是如何如何添加JAVA依赖库. 默认的android项目有两个build.gradle文件,分别位于顶级目录,和应用自己的目录下(通常放在一个叫app的目录下面). gradle支持多种方式列 ...
- Android实现splash
笔者近日遇到一个android中双splash的问题.要求先实现百度的logo,在接入自己的logo. public class MainActivity extends BaseActivity { ...
- api xml database 设计一种数据库
w 问题 0-新增和读取,可以忽略更新和删除: 1-被请求方的xml dom结构多层且不定,且未来可能增删某些键(dom节点),且键值长度最值可能无法确定: 3-请求过程可能出现异常exception ...
- python3 中引用 HTMLTestRunner.py 模块的注意事项
HTMLTestRunner.py支持python2中运行,如果在python3.6.2中引用HTMLTestRunner.py模块,需要做一下更改: 1.更改HTMLTestRunner.py模块中 ...
- 004-JVM指令集(指令码、助记符、功能描述)
一.JVM指令助记符 1)操作数栈 变量到操作数栈:iload,iload_,lload,lload_,fload,fload_,dload,dload_,aload,aload_ 操作数栈到变量:i ...
- 0107-将Monolith重构为微服务
重构到微服务的概述 将单一应用程序转换为微服务的过程是应用程序现代化的一种形式.这是开发人员几十年来一直在做的事情.因此,在将应用程序重构为微服务时,我们可以重用一些想法. 一个不使用的策略是重写“B ...
- Percona备份mysql全库及指定数据库(完整备份与增量备份)
Percona Xtrabackup备份mysql全库及指定数据库(完整备份与增量备份) Xtrabackup简介 Percona XtraBackup是开源免费的MySQL数据库热备份软件,它能对I ...
- ABAP发邮件函数
步骤: 一.检查输入参数, (1)未指定文件類別代碼,(2)未指定郵件主題, (3)未指定郵件內容, (4)未指定發送人郵件地址, (5)未指定接收人郵件地址, 二.调用发送功能, (1)创建发送请求 ...
- split命令
语法:split [OPTION]... [INPUT [PREFIX]]常用参数说明: -a, --suffix-length=N generate suffixes of l ...