8.26腾讯音乐笔试第三题求解


如题,问答+前2道编程就花了我30分钟,最后一道DP了1个小时还是只能过60%,然后就超时了离谱😫😫
我的代码:
        public int FillArray (int[] a, int k) {
            // write code here
            int mod = (int)(Math.pow(10, 9)+7);
            int n =a.length;
            //dp[i][j]表示第i个数选择j的方案数
            int[][] dp = new int[n][k+1];
            if(a[0]!=0){
                dp[0][a[0]]=1;
            }else{
                for(int i=1;i<=k;i++){
                    dp[0][i] = 1;
                }
            }

            for(int i=1;i<n;i++){
                if(a[i]!=0){
                    for(int j=0;j<=a[i];j++){
                        dp[i][a[i]] = (dp[i][a[i]]%mod + dp[i-1][j]%mod)%mod;
                    }
                }else{
                    for(int j=0;j<=k;j++){
                        for(int x=0;x<=j;x++){
                            dp[i][j] = (dp[i][j]%mod + dp[i-1][x]%mod)%mod;
                        }
                    }
                }
            }

            int ans = 0;
            if(a[n-1]!=0){
                ans = dp[n-1][a[n-1]];
            }else{
                for(int i=0;i<=k;i++){
                    ans = (ans%mod+dp[n-1][i]%mod)%mod;
                }
            }
            return ans;
        }

状态压缩后,还是只能60%,离谱

#腾讯笔试##腾讯音乐娱乐##笔经#
全部评论
感觉这个倒着做是不是就可以做滚动优化,第二维得j也可以变成大于
点赞 回复 分享
发布于 2021-08-26 21:13
老哥,我也想到的是DP,和你的不太一样,但是我不知道对不对,因为我在最后的时候发现有个符号写错了... 我定义的dp数组是dp[i][j],i表示一长串连续的0的个数,j表示这一长串连续的0能使用的数字的个数。 举个例子,0 0 2 0 0 0 3 4 0 0 8 0 0 0 0,假设k是10: 遍历到2的时候,最前面连续的两个0的所有可能性是dp[2][2] 遍历到3的时候,接着中间连续的三个0的所有可能性是dp[3][2] 遍历到8的时候,中间连续的两个0的所有可能性是dp[2][5] 最后数组遍历完之后,最后连续的四个0的所有可能性是dp[4][3] 最后把这四串0的结果乘起来,不知道这种思路是否正确? 然后dp[i][j] = dp[i-1][j] + dp[i][j-1], base case为:dp[1][p] = p,dp[p][1] = 1。
点赞 回复 分享
发布于 2021-08-26 21:38
咱俩代码和思路简直不要太相似, 可是我只过了 12% 
点赞 回复 分享
发布于 2021-08-26 21:53
这是今晚用dp ac了的代码
点赞 回复 分享
发布于 2021-08-26 23:15
点赞 回复 分享
发布于 2021-08-27 12:12
当你那个位置为0时里面两重循环了已经,会超时的。
点赞 回复 分享
发布于 2021-08-27 13:51

相关推荐

jack_miller:杜:你不用我那你就用我的美赞臣
点赞 评论 收藏
分享
1 4 评论
分享
牛客网
牛客企业服务