当前位置: 首页 > news >正文

Array Description(Dynamic programming)

题目描述

You know that an array has n integers between 1 and  m, and the absolute difference between two adjacent values is at most 1.
Given a description of the array where some values may be unknown, your task is to count the number of arrays that match the description.

输入

The first input line has two integers n and m: the array size and the upper bound for each value.
The next line has n integers x1,x2,...,xn: the contents of the array. Value 0 denotes an unknown value.
Constraints
1 ≤ n ≤ 10^5
1 ≤ m ≤ 100
0 ≤ xi ≤ m

输出

Print one integer: the number of arrays modulo 10^9+7.

样例输入
3 5
2 0 2
样例输出
3
提示

The arrays [2,1,2], [2,2,2] and [2,3,2] match the description.

思路分析

dp_prev数组用于存储前一个位置的状态值。

对于数组  arr 中的每个位置  i(0-based indexing),分情况进行处理:

1.当 arr[i] = 0 时:

(1)如果 i = 0,即数组的第一个位置,此位置可以取区间 [1, m] 内的任意值,所以 dp_prev[j] 初始化为 1(其中 1 ≤ j ≤ m);

(2)若 i > 0,则需考虑前一位置的数值,通过遍历 j 从 1 到 m,计算当前位置 i 取值为 j 的可能性,即 dp_cur[j] = (dp_prev[j - 1] + dp_prev[j] + dp_prev[j + 1])%mod。

2.当 arr[i] ≠ 0 时,该位置只能取 arr[i] 这个值,所以 dp_cur[arr[i]] = (dp_prev[arr[i] - 1] + dp_prev[arr[i]] + dp_prev[arr[i] + 1] )%mod。

每处理完 arr 数组中的一个元素,就将 dp_prev 更新为 dp_cur,以保存当前位置的状态供后续使用。

最后,将 dp_prev 数组中从 1 到 m 的所有值累加并对 mod 取模,得到最终结果并输出。 

代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
int n,m;
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n>>m;vector<int>arr(n);for(int i=0;i<n;i++){cin>>arr[i];}vector<ll>dp_prev(m+2,0);if(arr[0]==0){for(int i=1;i<=m;i++){dp_prev[i]=1;}}else{dp_prev[arr[0]]=1;}for(int i=1;i<n;i++){vector<ll>dp_cur(m+2,0);if(arr[i]==0){for(int j=1;j<=m;j++){dp_cur[j]=(dp_prev[j-1]+dp_prev[j]+dp_prev[j+1])%mod;}}else{int k=arr[i];dp_cur[k]=(dp_prev[k-1]+dp_prev[k]+dp_prev[k+1])%mod;}dp_prev=dp_cur;}ll ans=0;for(int i=1;i<=m;i++){ans=(ans+dp_prev[i])%mod;}cout<<ans;return 0;
}

http://www.xdnf.cn/news/1262359.html

相关文章:

  • 在发布应用程序内测时如何选择合适的分发上架方式?
  • Git 基础操作笔记(速查)
  • 视频遥测终端机是什么,其工作原理和应用领域
  • 高校合作 | 世冠科技联合普华、北邮项目入选教育部第二批工程案例
  • 01数据结构-图的概念和图的存储结构
  • 数据结构---二叉树(概念、特点、分类、特性、读取顺序、例题)、gdb调试指令、时间复杂度(概念、大O符号法、分类)
  • 【世纪龙科技】数智重构车身实训-汽车车身测量虚拟实训软件
  • 二叉树实现
  • Docker 创建镜像错误记录
  • Redis缓存击穿、穿透雪崩
  • 【NFTurbo】基于DockerCompose一键部署
  • gmssl私钥文件格式
  • 用户组权限及高级权限管理:从基础到企业级 sudo 提权实战
  • 《从零构建大语言模型》学习笔记2,文本数据处理1(以及tiktoken库无法下载gpt2参数,调用get_encoding时SSL超时的解决方法)
  • Redis是单线程性能还高的原因
  • SaaS 版 MES 系统业务文档
  • 【SpringBoot】SpringBoot配置
  • GPT OSS 双模型上线,百度百舸全面支持快速部署
  • 华为USG防火墙双机,但ISP只给了1个IP, 怎么办?
  • 医防融合中心-智慧化慢病全程管理医疗AI系统开发(上)
  • C++信息学奥赛一本通-第一部分-基础一-第2章-第5节
  • 单层 PDF 与双层 PDF:一字之差,功能大不同
  • 修复C++14兼容性问题 逻辑检查
  • 力扣-238.除自身以外数组的乘积
  • FileLink:企业数据传输的革新者​
  • Node.js Turbo 包入门教程
  • Sklearn 机器学习 数据降维PCA 使用PCA算法
  • Spark在什么情况下CBO才会判断失误,如何避免
  • 什么是2米分辨率卫星影像数据?
  • Flutter开发 多孩子布局组件