【计数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 ...
随机推荐
- 白鹭引擎EUI做H5活动 巩固篇
项目目录 上面这张图片是项目的目录结构,咋们一点一点来讲解: .wing:包括 Egret 项目的任务配置文件和启动配置文件. wingProperties.json:Egret Wing 项目配置文 ...
- initData()
void initData(){ int i, j; //加载数据时让用户等待,一般情况加载数据比较快 printf("游戏加载中,请稍后........."); //遍历地图中的 ...
- L1-049 天梯赛座位分配 (20 分)
L1-049 天梯赛座位分配 (20 分)(Java解法) 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所 ...
- Matlab - Matlab 2016a 安装破解教程
https://blog.csdn.net/u012313335/article/details/73733651/ Matlab 2016a 安装包及破解教程百度云分享链接: 链接:https:// ...
- springBoot2.X---过滤器,监听器,拦截器
过滤器,监听器,拦截器 一.画图理解 过滤器(filter),监听器(listener),拦截器(Interceptor). 通过两幅图我们可以理解拦截器和过滤器的特点 1.过滤器 过滤器是在请求进入 ...
- vscode如何右键选择浏览器运行html文件
我们利用Vscode软件编写html的时候,一般都想右键选择html文件,然后直接选择浏览器运行,但是默认是没有的: 下面鄙人给大家分享一下如何设置. 这里你会发现有好多类似的插件,你自己选择一个喜欢 ...
- LC 802. Find Eventual Safe States
In a directed graph, we start at some node and every turn, walk along a directed edge of the graph. ...
- LC 241. Different Ways to Add Parentheses
Given a string of numbers and operators, return all possible results from computing all the differen ...
- lsnrctl: .... cannot restore segment prot after reloc: Permission denied
cannot restore segment prot after reloc: Permission denied Table of Contents 1. 错误信息 2. 解决方法 1 错误信息 ...
- [Ubuntu]18终止程序运行
方法: 一.使用命令 killall (使用方便,但要知道卡死应用程序的名称) 二.使用 gnome-system-monitor (不知道卡死应用程序的名称,也可以慢慢找出) 操作步骤: step ...