有没有做了今天上午的阿里笔试题的大佬指导一下

给定一个n,m,其中n为数组中元素的个数,m为限定值,再给了一个数组,从数组中挑选一个子序列,和对m取余最大,想的是用动态规划,但是一直都只是通过15%,不知道什么原因:
n,m=map(int,input().split())
a=list(map(int,input().split()))
temlist=[0 for i in range(n+1)]
temlist[0]=0
for i in range(n):
    temmax=max(temlist[i],(temlist[i]+a[i])%m)
    for j in temlist[:i]:
        if i+1!=n and temmax>j+a[i+1]:
            continue
        elif i+1!=n and temmax<j+a[i+1] and j+a[i+1]<m:
            temmax=j+a[i+1]
        else:
            break
    temlist[i+1]=temmax
#print(temlist)
print(temlist[-1])


#阿里巴巴##笔试题目#
全部评论
补一下样例输入:6 114 12 3 7 6 2输出:10
1 回复
分享
发布于 2020-04-24 11:02
同问,我也一直15,要么就是超时
点赞 回复
分享
发布于 2020-04-24 10:13
联易融
校招火热招聘中
官网直投
dp就是15%   dfs就超时。。太难了
点赞 回复
分享
发布于 2020-04-24 10:16
第二题更气,我做了出来但是平台上一直出错,本地就根本没问题,气死我了,调试了半小时也没找到问题在哪
点赞 回复
分享
发布于 2020-04-24 10:23
楼主动态规划的公式是啥,python 看不太懂
点赞 回复
分享
发布于 2020-04-24 10:26
同15%  跪了
点赞 回复
分享
发布于 2020-04-24 10:26
暴力子序列超时30%😂😂
点赞 回复
分享
发布于 2020-04-24 10:29
我也暴力backtracking然后百分之30😂 第二题我光是搞输入流就弄了十几分钟我心态崩了。。。
点赞 回复
分享
发布于 2020-04-24 10:56
public class Main {     public static void main(String[] args) {         int n = 6;         int m = 11;         int[] nums = new int[]{4, 5, 3, 4, 11, 2};         int[][] dp = new int[n][m];         int res = Integer.MIN_VALUE;         for (int k = 0; k < m; k++) dp[0][nums[0] % m] = 1;         for (int i = 1; i < n; i++) {             for (int j = 0; j < m; j++) {                 if (dp[i - 1][j] == 1) {                     dp[i][(j + nums[i]) % m] = 1;                     dp[i][j] = 1;                 } else {                     dp[i][nums[i] % m] = 1;                 }             }         }         for (int i = 0; i < n; i++) {             for (int j = 0; j < m; j++) {                 if (dp[i][j] == 1) {                     res = Math.max(res, j);                 }             }         }         System.out.println(res);     } }
点赞 回复
分享
发布于 2020-04-24 11:51
第一题一开始做得时候每一步只把大的减了出来,想成连续的subset了。现在改了下,复杂度O(n*m),不知道还能不能再优化,也不知道能不能ac。。。
点赞 回复
分享
发布于 2020-04-24 14:47
同15%
点赞 回复
分享
发布于 2020-04-24 15:57
我最初的想法是类似0-1背包问题,用1维dp数组,然后就提示超内存限制了,只过了15%
点赞 回复
分享
发布于 2020-04-24 16:59
哪位大佬有第二题的做法
点赞 回复
分享
发布于 2020-04-24 21:24
我第一题也做了很久 但是最后还是没出来 没找到合适的算法实现 第二题的话就没时间做了
点赞 回复
分享
发布于 2020-04-24 21:47
https://zhuanlan.zhihu.com/p/136158640
点赞 回复
分享
发布于 2020-04-25 12:41
分别枚举前半段和后半段所有和A、B。对AB每个元素取m模。取模后,AB每个元素都小于m,这时候,取A中的a和B中的b,a+b<2m,只需要考虑最接近2m和最接近m两种情况。前者只要把ab的最大元素取出来就行,后者是一个简单的双指针题——两个数组A\B,找到a+b<m且最接近m。
点赞 回复
分享
发布于 2020-07-21 23:40

相关推荐

5 21 评论
分享
牛客网
牛客企业服务