DP - 2016网易杭研笔试题A

2016网易杭研笔试题A

Problem‘s Link

----------------------------------------------------------------------------

Mean:

有一个边长为n的立方体,内部的每一个小立方体内有一个数字。如果取了当前这个小立方体,则小立方体的:

1.上下相邻两层将会消失;

2.前后相邻两列将会消失;

3.左右相邻两个将会消失;

找出一种取法,使得取到的数的sum最大,输出sum。

analyse:

现场面试时挂在这题上了,想了五分钟没想出来,面试官就不让想了TAT

回来想了一下,是个简单题,当时现场面试还是有点紧张了,只想出了二维的做法.

对于这题,关键的地方在于找对DP的顺序:点-->线-->面

首先考虑规则3(左右相邻两个将会消失),可以将3维dp压缩到2维,且不会破环约束条件;

再来考虑规则2(前后相邻两列将会消失),可以将2维dp压缩到1维,且不会破环约束条件;

最后对1维的数组在进行一次dp,结果即为答案.

看着挺复杂,想到了就是个大水题.

Time complexity: O(N^3)

view code

/**<
Mean:
   有一个长宽高为(n,m,h)的长方体,内部的每一个小立方体内有一个数字。如果取了当前这个小立方体,小立方体的:
       1.上下相邻两层将会消失;
       2.左右相邻两列将会消失;
       3.前后相邻两个将会消失;
   找出一种取法,使得取到的数的sum最大,输出sum。
*/

#include <bits/stdc++.h>
using namespace std;

class Solution
{
public:
   int getMax(vector<vector<vector<int> > > &cube)
   {
       int n=cube.size();
       vector<vector<int> > dp2(n,vector<int>(n,0));
       vector<int> tp(n);
       // 3D zip to 2D
       for(int i=0;i<n;++i)
       {
           for(int j=0;j<n;++j)
           {
               for(int k=0;k<n;++k)
               {
                   tp[k]=cube[i][k][j];// be careful
               }
               dp2[i][j]=zipToPoint(tp);
           }
       }
       // print 2D
//        puts("-------------------------------");
//        for(int i=0;i<n;++i)
//        {
//            for(int j=0;j<n;++j)
//                cout<<dp2[i][j]<<" ";
//            cout<<endl;
//        }
//        puts("-------------------------------");

vector<int> dp1(n,0);
       // 2D zip to answer
       for(int i=0;i<n;++i)
       {
           for(int j=0;j<n;++j)
               tp[j]=dp2[i][j];
           dp1[i]=zipToPoint(tp);
       }
       return zipToPoint(dp1);
   }

int zipToPoint(vector<int> & nums)
   {
       int n=nums.size();
       vector<int> dp(n,0);
       dp[0]=nums[0];
       for(int i=1;i<n;++i)
       {
           if(i==1)
               dp[i]=max(dp[0],nums[1]);
           else
               dp[i]=max(nums[i]+dp[i-2],dp[i-1]);
       }
       return dp[n-1];
   }
};

int main()
{
   int T,n;
   scanf("%d",&T);
   while(T--)
   {
       scanf("%d",&n);
       vector<vector<vector<int> > > cube(n,vector<vector<int> >(n,vector<int>(n,0)));
       for(int i=0;i<n;++i)
       {
           for(int j=0;j<n;++j)
           {
               for(int k=0;k<n;++k)
                   scanf("%d",&cube[i][j][k]);
           }
       }
       Solution solution;
       int ans=solution.getMax(cube);
       printf("%d\n",ans);
   }
   return 0;
}

/*
-----------------------
1
3
1 2 3
4 5 6
7 8 9

10 11 12
13 14 15
16 17 18

19 20 21
22 23 24
25 26 27
-----------------------
112

*/

时间: 2024-12-26 17:37:04

DP - 2016网易杭研笔试题A的相关文章

2016网易内推笔试题

转载注明出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/52102841 本人笔试的计算机视觉方向,编程题和其他研发岗位类似. 欢迎小伙伴们一起讨论出正确答案. 共20个选择题,3个编程题,1个简答题 一.选择题 1.Linux中,提供TCP/IP包过滤功能的软件叫什么? A.iptables    B.route    C.rarp    D.filter 2.设一组初始关键字序列为{31,65,82,7613,27,1

网易2018校招笔试题-数组能不能满足重排列后任意相邻的元素积都是4的倍数

今天看了一下网易最新的校招笔试题: 小易有一个长度为N的正整数数列A = {A[1], A[2], A[3]..., A[N]}.牛博士给小易出了一个难题:     对数列A进行重新排列,使数列A满足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍数.     小易现在需要判断一个数列是否可以重排之后满足牛博士的要求. 代码如下: 1 import java.util.Scanner; 2 3 /** 4 * Created by jy on 2017/9/9. 5

阿里巴巴 2016 java 实习岗位笔试题(昨天出炉)

1 Hadoop是当下大数据处理的事实标准之一,具有广泛的应用场景.作为Hadoop生态基础的HDFS分布式文件系统,它具有极高的容错性,适合部署在廉价的机器上,并能提供高吞吐量的数据访问能力,专为大规模数据存取而设计. 请用Java程序来模拟HDFS的三个应用场景:写文件.读文件.Node节点单点故障.场景1为必选,场景2和3可选但必需延续场景1的实现方案.程序请使用JDK原生API来实现. 问题1:请用文字阐述你的设计方案. 问题2:请用Java程序来分别实现你的方案. 2 优惠券是目前较为

2017美团&amp;网易&amp;360部分笔试题

一.美团笔试 问答题: 1.JavaScript把一个参数从页面A传递给页面B,进行某些操作,然后由页面B回传给页面A 2.各种排序算法的时间复杂度:冒泡排序,选择排序,插入排序,快速排序,归并排序,堆排序. 参考:http://blog.chinaunix.net/uid-25906157-id-3318529.html 编程题: 找出两个有序数组的公共元素,例:有序数组[3, 5, 7, 8, 10, 12]和有序数组[15, 10, 8, 7, 4, 3, 1]的公共元素为(8, 10)

百度2016研发工程师模拟笔试题

1.下面程序的输出结果是?     #include<iostream.h>    void main(){        int n[][3]={10,20,30,40,50,60};        int (*p)[3];        p=n;        cout<<p[0][0]<<","<<*(p[0]+1)<<","<<(*p)[2]<<endl;    } A.10

网易2017 实习生笔试题

1.[编程题]消除重复元素 时间限制:1秒 空间限制:32768K 小易有一个长度为n序列,小易想移除掉里面的重复元素,但是小易想是对于每种元素保留最后出现的那个.小易遇到了困难,希望你来帮助他. 输入描述: 输入包括两行: 第一行为序列长度n(1 ≤ n ≤ 50) 第二行为n个数sequence[i](1 ≤ sequence[i] ≤ 1000),以空格分隔 输出描述: 输出消除重复元素之后的序列,以空格分隔,行末无空格 输入例子: 9 100 100 100 99 99 99 100 1

网易的一道笔试题的参考解法---关于广告牌投放问题

有N个广告牌(N<=10万)可以投放广告,有k个用户(k<10亿)在这些广告牌上投放广告.操作rent(i,j,k)将从i到j块广告牌展示用户k的广告,如果原来有别的广告就覆盖掉. 操作query(i)返回第i个广告牌上现在投放的是哪个广告. rent和query操作出现的频率相等.要求设计一个数据结构和相应的算法,尽可能快的实现这两种操作. 1 package test; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 pu

2014年网易互联网在线笔试题一道

题目:有四个文件,每个文件中存有100万个int型整数,内存限制1M,该如何最优地得到四个文件的交集数,也就是在四个文件都出现的数的个数? 我的想法:因为内存限制1M,也就是1024*1024个字节,小于一个文件中所有数所占的存储100 0000*4,所以文件中的数没办法一次装到内存.采用外部排序.归并等方法实现. 具体: 1.最开始应该是对每个大文件进行外部排序,也就是n次从大文件中取出一部分数在内存中进行快速排序或堆排序,然后将结果存入小文件中,存入小文件的同时去重: 2.然后对n个小文件进

百度2016研发project师笔试题(四)

2015/12/8 10:42(网上收集整理的,參考答案在后面.若有错误请大神指出) 1. 关于MapReduce的描写叙述错误的是() A. 一个Task一般会把输入集切分成若干独立的数据块 B. 通常计算节点和存储节点是同一节点 C. 通常,作业的输入输出都会被存储在文件系统中 D. MapReduce框架会先排序map任务的输出 2. 设哈希表长度为11,哈希函数H(K)=(K的第一个字母在字母表中的序号)MOD11,若输入顺序为(D,BA,TN,M,CI,I,K,X,TA),採用内散列表