小美的数组合并(美团20240427年暑期实习笔试真题)

news/2024/9/22 21:06:32

题目:小美的数组合并

小美拿到了一个数组,她每次操作可以将两个相邻元素ai合并为一个元素,合并后的元素为原来两个元素之和。小美希望最终数组的最小值不小于k。她想知道有多少种不同的合并结果?

输入描述

第一行输入两个正整数n,k,代表数组大小和数组的最大值。

第二行输入个正整数ai,代表小美拿到的数组。

1<=n,k,ai<=200

输出描述

输出一个整数,代表小美可以得到多少种不同的结果。由于结果可能很大,输出对10^9+7取模的结果。

样例输入

4 4

2 3 4 5

样例输出

4

说明

可能得到的数组有:[5,4,5]、[9,5]、[5,9]、[14]这四种。

题解

记忆化搜索

首先定义:dfs(i,p)表示,从第0到 i-1个数,前面是做完合并操作的。当前从第i个位置的数开始考虑,在这样子的子问题下,有多少种合并方法。并且p表示的是,在前面做完合并的考虑操作之后,第i个数的前一个数是什么(极端情况下第0到i-1个数全合并了,也有可能第i-1个数字没有被合并,保持了原来的样子)。

那么递归的最深处的条件是什么呢?是dfs(n-1,p)吗?其实是dfs(n,p),这个时候表示从第0号元素到第n-1号元素,总共n个数字,都做完合并了,我们要考虑的子问题中的数字个数为0了,那分法就是1,但是这个时候还要看一下我们的p,也就是前面做完合并的考虑操作之后,第n号元素(其实为空因为数组就是从0到n-1)的前一个数是什么,如果这个前一个数字比k小,说明这种分法是不符合要求的,返回0,否则的话是满足要求的,返回1。

那么在dfs的中间层中,对于dfs(i,p),如果p,也就是在第0号元素到第n-1号元素考虑完合并之后,第n号元素(其实为空因为数组就是从0到n-1)的前面的那一个数,比k小,那么说明它如果不和a[i]合并的话是不行的(合并了就一定满足条件吗?交由dfs(i+1,?)去判断吧),那么dfs(i,p)=dfs(i,p+a[i]),而如果p>=k,那么就说明它无论和a[i]合并与否,都是可以的,即dfs(i,p) = dfs(i+1,p+a[i]) + dfs(i+1,p)

最后再在dfs的过程中记忆化一下,把返回值存一下dp数组做一下记忆化搜索。

(代码未经验证,但思路大概是这么个思路)

#include <bits/stdc++.h>
using namespace std;const int MOD = 1e9 + 7;vector<vector<int>> dp;
vector<int> arr;
int n, k;int dfs(int i, int p) {if (i == n) {return p >= k ? 1 : 0;}if (dp[i][p] != -1) {return dp[i][p];}int cnt = 0;if (p >= k) {cnt += dfs(i + 1, arr[i]);cnt %= MOD;cnt += dfs(i + 1, p + arr[i]);cnt %= MOD;} else {cnt += dfs(i + 1, p + arr[i]);cnt %= MOD;}dp[i][p] = cnt;return cnt;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/63476.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

[CVPR2024]DeiT-LT Distillation Strikes Back for Vision Transformer Training on Long-Tailed Datasets

在长尾数据集上,本文引入强增强(文中也称为OOD)实现对DeiT的知识蒸馏的改进,实现尾部类分类性能的提升。 动机ViT相较于CNN缺少归纳偏置,如局部性(一个像素与周围的区域关系更紧密)、平移不变性(图像的主体在图像的任意位置都应该一样重要)。因此需要大型数据集进行预…

MobaXterm24.2 分析

MobaXterm 目录MobaXterm0、启动窗口 TForm11、TForm1_FormCreatedecrypt_9FDA481)xxBase64Decode_9FD80C2)DecryptBytes_9FD9DC2、许可结构1) Type2) version_info_3A83) user_limit4) Version5) unuse6)NoGames7)NoPlugins解析函数parse_9FEB5Cothersub_A03F80TFormAbout…

ABC372 F 题解

ABC372 F 题解F - Teleporting Takahashi 2 先把问题转化一下:把环断开成链,复制 \((K + 1)\) 层,每走一步就相当于前进一层:可以想到一个简单的 dp:设 \(f(i, j)\) 表示走到第 \(i\) 层第 \(j\) 个位置的方案数。初始化:\(f(0, 1) = 1\),其它均为 \(0\),表示 Takahash…

【做题笔记】收集邮票 做题笔记

水。P4550 收集邮票展开目录 目录P4550 收集邮票ReadingStep 1Step 2Code彩蛋Reading \(k\ge 1\) 时,可以通过支付 \(k\) 元钱获得一张 \(n\) 种邮票中的某种邮票。这 \(n\) 种邮票等概率出现,求买到全部 \(n\) 种邮票的花费期望。 Step 1 \(k\) 次 \(k\) 元太难搞了,干脆直…

单机版 ClickHouse 部署和 SpringBoot 程序访问

ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。 OLAP 为联机分析处理,专注于统计查询;OLTP 为联机事务处理,专注于增删改。 ClickHouse 的优势在于单表…

用户验收测试指南8实施测试

8 实施测试 到目前为止,我们已经规划了我们的 UAT 演习,并制定了测试的总体战略,然后设计了所有测试并编写了测试脚本。现在,我们已准备好实施计划和进行测试。 在本章中,我们将介绍如何安排所有测试,以实现我们的测试策略,并根据验收标准评估系统。为此,我们需要记录所…

Linux中删除文本中所有的重复的字符保持唯一

001、[root@PC1 test]# ls a.txt [root@PC1 test]# cat a.txt ## 测试文本 abk akkkkccc 8777 ,,, aaaf 333444 --- uukk22 [root@PC1 test]# cat a.txt | tr -s [:alnum:] ## 删除连续的重复字符 abk akc 87 ,,, af 34 --- uk2 [root@PC1 test]# …