美团2024届秋招笔试第二场编程真题

编程入门 行业动态 更新时间:2024-10-15 12:36:09

美团2024届秋招<a href=https://www.elefans.com/category/jswz/34/1769509.html style=笔试第二场编程真题"/>

美团2024届秋招笔试第二场编程真题

分析:暴力角度看,因为数组a和b总和一样,所以实际上是将总和m划分为n个数字,且每个数字都和a数组不一样的方案数。当然会超时。从数据角度看,平方级别算法是可以的。

其实用动态规划的四步法分析起来还是很简单的,我们要构造一个b数组,n个元素,总和是m。哪么按DP思路,先构造一个n-1的数组,总和是m-b[n]。只要b[n]!=a[n]的方案数都是可行的。

因此DP方程很容易得到,dp[i][j]表示构造一个i个数据元素,总和是j的数组。

哪么dp[i][j]=dp[i-1][[j-1]+dp[i1][j-2]+..........

dp[i-1][[j-1]表示我们第i个元素选了1,所以还有j-1的总和给前i-1个元素。当然和a[i]相同的那个排除掉即可。

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll n,a[500],dp[305][505],mod=1e9+7,m;/**< 长整型不是必须,但不容易出错 */
int main()
{int i,j,k;cin>>n;for(i=1;i<=n;i++)cin>>a[i],m+=a[i];dp[0][0]=1;/**< 你懂的,没这句全是0了 */for(i=1;i<=n;i++){for(j=1;j<=m;j++){/**< dp[i][j],前i个数总和是j,且满足条件的方案数量 */for(k=1;k<=j;k++)/**< k是b[i],也就是序列最后一个数字,前i-1个的方案就是dp[i-1][j-k] */if(k!=a[i])dp[i][j]=(dp[i][j]+dp[i-1][j-k])%mod;}}cout<<dp[n][m];return 0;
}

更多推荐

美团2024届秋招笔试第二场编程真题

本文发布于:2023-11-15 04:40:37,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1593812.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:笔试   真题   第二场   届秋招

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!