【计数dp】Array Without Local Maximums
参考博客:【CF1068D】Array Without Local Maximums(计数DP)
【题意】
n<=1e5
dp[i][j][k]表示当前第i个数字为j,第i-1个数字与第i个之间大小关系为k的方案数(a[i-1]<a[i],=,>)
转移时使用前缀和和后缀和加速
【状态转移】:
因为情况已经分成三种情况了,小于,等于,大于。
然后根据题目意思,就是不能出现一种情况,a[i-1] < a[i] > a[i+1]
就是说,当我们转移:"大于"时,前一个状态不能是”小于“。
【小结】:
道理我都懂,但我就是写不出来。一头雾水,但是我看了看题解,我就醍醐灌顶了。。。
【代码】(里面有详细的解释)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = ;
const int N = 1e5+;
const int M = ;
ll f[N][M][],tmp;
int a[N],n; /*
f[i][j][k]
第i个位置上,的数值为j,与前一个数的关系为k. k = 0 a[i-1] < a[i] /
k = 1 a[i-1] == a[i] -
k = 2 a[i-1] > a[i] \ */ int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]); /*
由于题意让我们a[1] <= a[2]
我们初始化时,在1的位置上
必须让f[1][i][0],以防止 a[1] > a[2]的情况
*/ for(int i=;i<=;i++){
if( a[] == - || i == a[] ) f[][i][] = ;
else f[][i][] = ;
}
//[2,n]上进行状态转移
for(int i=;i<=n;i++){ //枚举当前位置的值,‘=‘的情况 , k = 1 '-'
for(int j=;j<=;j++){
if( a[i] == - || a[i] == j )
f[i][j][] = (f[i-][j][]+f[i-][j][]+f[i-][j][])%mod;
else
f[i][j][] = ;
} //枚举当前位置的值,‘<‘的情况 , k = 0 '/'
//∵a[i-1] < a[i]
//前一个位置可能有多种情况,所以当前位置应该是记录前缀和
tmp = ;
for(int j=;j<=;j++){
if( a[i] == - || a[i] == j )
f[i][j][] = tmp ;
else f[i][j][] = ;
tmp = (tmp + f[i-][j][] + f[i-][j][] + f[i-][j][] ) % mod ;
} //枚举当前位置的值,‘>‘的情况, k = 2 '\'
//∵a[i-1] > a[i]
//前一个位置可能有多种情况,所以当前位置应该是记录后缀和
tmp = ;
for(int j=;j>=;j--){
if( a[i] == - || a[i] == j )
f[i][j][] = tmp ;
else f[i][j][] = ;
tmp = ( tmp + f[i-][j][] + f[i-][j][] ) %mod ;
}
}
ll ans = ; /*
题目要求:
∵a[n-1] >= a[n]
∴从两种状态进行转移,k=1.
*/
for(int i=;i<=;i++){
ans = ( ans + f[n][i][] + f[n][i][] ) % mod ;
} printf("%lld\n",ans);
return ;
}
计数dp
【计数dp】Array Without Local Maximums的更多相关文章
- 【CF1068D】Array Without Local Maximums(计数DP)
题意: n<=1e5 思路:卡内存 dp[i][j][k]表示当前第i个数字为j,第i-1个数字与第i个之间大小关系为k的方案数(a[i-1]<a[i],=,>) 转移时使用前缀和和 ...
- codeforces 1068d Array Without Local Maximums dp
题目传送门 题目大意:给出一个长度为n的数组,这个数组有的数是给出的,有的数是固定的,且范围都在[1,200]之间,要求这个数组中,每一个数字都小于等于 前后两个数字的最大值,求方案数mod p. 思 ...
- 【非原创】codeforces - 1067A Array Without Local Maximums【dp】
学习博客:戳这里 附本人代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 co ...
- 「题解报告」CF1067A Array Without Local Maximums
大佬们的题解都太深奥了,直接把转移方程放出来让其他大佬们感性理解,蒟蒻们很难理解,所以我就写了一篇让像我一样的蒟蒻能看懂的题解 原题传送门 动态规划三部曲:确定状态,转移方程,初始状态和答案. --神 ...
- HDU5800 To My Girlfriend 背包计数dp
分析:首先定义状态dp[i][j][s1][s2]代表前i个物品中,选若干个物品,总价值为j 其中s1个物品时必选,s2物品必不选的方案数 那么转移的时候可以考虑,第i个物品是可选可可不选的 dp[i ...
- CodeForces 176B Word Cut (计数DP)
Word Cut Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit St ...
- [DP之计数DP]
其实说实在 我在写这篇博客的时候 才刚刚草了一道这样类型的题 之前几乎没有接触过 接触过也是平时比赛的 没有系统的做过 可以说0基础 我所理解的计数dp就是想办法去达到它要的目的 而且一定要非常劲非常 ...
- HDU4815/计数DP
题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=4815] 简单说一下题意: 有n道题,每到题答对得分为a[ i ],假如A不输给B的最小概率是P,那么A ...
- HDU 6377 度度熊看球赛 (计数DP)
度度熊看球赛 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
随机推荐
- maven整合ssm框架
1.创建maven web工程 创建完成后,项目结构如下 2.项目配置文件 在pom.xml中添加SSM框架相关jar包的依赖关系,pom.xml代码如下 <?xml version=" ...
- 手把手教你在Linux系统下安装MySQL
在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB. 1. 下载并安装MySQL官方的 Yum R ...
- LeetCode109----链表转为二叉搜索树
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例:给定的有序链表: [-10, ...
- Python 寻找文件夹里以特定格式结尾的文件
代码: import os, re, time name = 'linuxday01' flags = True# 文件夹bi_test中的文件列表 print os.listdir('E:\\bi_ ...
- 如何用MATLAB GUI创建图形用户界面
MATLAB是众多理工科学生及工程师经常使用的一款数学软件,除了可以实现数据处理,矩阵运算.函数绘制等功能外,MATLAB还可以实现图形用户界面的设计. 下面介绍如何让小白也能用GUI创建最基本的用户 ...
- express使用ejs模板引擎渲染html文件
小场景小知识点. 在使用express过程中,按照官网教程,利用express生成器很容易初始化express项目模板. 那么初始化项目之后应该如何使用ejs作为模板引擎呢?如下 // 注释掉默认生成 ...
- sqlserver创建链接服务器连接sqlserver脚本
示例: EXEC sp_addlinkedserver @server='MyLinkServer', --链接服务器别名 @srvproduct='', @provider='SQLOLEDB', ...
- 用Servlet返回JSON文本动态创建DataGrid
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC & ...
- vim在文件末尾增加内容
1.跳到文本的最后一行:按“G”,即“shift+g” 2.跳到最后一行的最后一个字符 : 先重复1的操作即按“G”,之后按“$”键,即“shift+4”.3 o:在当前行下面插入一个新行O:在当前 ...
- Centos安装openjdk
转载自:https://blog.csdn.net/youzhouliu/article/details/51183115 openjdk在linux各个平台下安装源中可以找到. 命令查找安装源中有什 ...