搜狗笔试题

简介:

转自:http://blog.csdn.net/huangxy10/article/details/8071242

搜狗:
1,有n*n个正方形格子,每个格子里有正数或者0,从最左上角往最右下角走,只能向下和向右走。一共走两次,把所有经过的格子的数加起来,求最大值。且两次如果经过同一个格子,则该格子的数只加一次。


思路:

搜索:一共搜(2n-2)步,每一步有四种走法。考虑不相交等条件可以剪去很多枝。

复杂度为O(4^n)


动态规划:

by:绿色夹克衫

详细算法思路:http://www.51nod.com/question/index.html#!questionId=657

s[k][i][j] = max(s[k-1][i-1][j-1],s[k-1][i-1][j],s[k-1][i][j-1],s[k-1][j][i])+map[i][k-i]+map[j][k-j];

复杂度为O(n^3)

复制代码
  1     #include <iostream>  
  2     #define MAX(a,b) (a)>(b)?(a):(b)  
  3     using namespace std;  
  4       
  5     #define N 5  
  6     int map[5][5]={  
  7         {2,0,8,0,2},  
  8         {0,0,0,0,0},  
  9         {0,3,2,0,0},  
 10         {0,10,0,0,0},  
 11         {2,0,8,0,2}};  
 12     int sumMax=0;  
 13     int p1x=0;  
 14     int p1y=0;  
 15     int p2x=0;  
 16     int p2y=0;  
 17     int curMax=0;  
 18       
 19     /* 
 20     编号系统为: 
 21     00000 
 22     11111 
 23     22222 
 24     33333 
 25     44444 
 26     走1次:编号有:0,1 
 27     走2次:编号有:0,1,2 
 28     走5次:编号有:1,2,3,4 
 29     走k次:编号有:l,l+1,l+2...,h-1 //low,high 的计算见code 
 30     编号到map坐标的转换为: 
 31     编号i,则对应map[i][k-i]. 
 32      
 33     dp方程为: 
 34     s[k][i][j] = max(s[k-1][i-1][j-1],s[k-1][i-1][j],s[k-1][i][j-1],s[k-1][j][i])+map[i][k-i]+map[j][k-j]; 
 35     */  
 36     int dp(void){  
 37         int s[2*N-1][N][N];  
 38         s[0][0][0]=map[0][0];  
 39           
 40         for(int k=1;k<2*N-1;k++){  
 41             int h = k<N?k+1:N;     //走k次后编号上限  
 42             int l = k<N?0:k-N+1;   //走k次后编号下限  
 43             for( int i=l;i<h;i++){  
 44                 for( int j=i+1; j<h; j++){  
 45                         int t=0;  
 46                         if( k==1||i<j-1)  
 47                             t= MAX(t,s[k-1][i][j-1]);  
 48                         if( i-1>=0)  
 49                             t= MAX(t, s[k-1][i-1][j-1]);  
 50                         if( j<h)  
 51                             t= MAX(t, s[k-1][i][j]);  
 52                         if( i-1>=0&&j<h)  
 53                             t= MAX(t, s[k-1][i-1][j]);  
 54                         s[k][i][j]=t+map[i][k-i]+map[j][k-j];  
 55                 }  
 56             }  
 57         }  
 58         return s[2*N-3][N-2][N-1]+map[N-1][N-1];  
 59     }  
 60       
 61     void dfs( int index){  
 62         if( index == 2*N-2){  
 63             if( curMax>sumMax)  
 64                 sumMax = curMax;  
 65             return;  
 66         }  
 67       
 68         if( !(p1x==0 && p1y==0) && !(p2x==N-1 && p2y==N-1))  
 69         {  
 70             if( p1x>= p2x && p1y >= p2y )  
 71                 return;  
 72         }  
 73       
 74         //right right  
 75         if( p1x+1<N && p2x+1<N ){  
 76             p1x++;p2x++;  
 77             int sum = map[p1x][p1y]+map[p2x][p2y];  
 78             curMax += sum;  
 79             dfs(index+1);  
 80             curMax -= sum;  
 81             p1x--;p2x--;  
 82         }  
 83       
 84         //down down  
 85         if( p1y+1<N && p2y+1<N ){  
 86             p1y++;p2y++;  
 87             int sum = map[p1x][p1y]+map[p2x][p2y];  
 88             curMax += sum;  
 89             dfs(index+1);  
 90             curMax -= sum;  
 91             p1y--;p2y--;  
 92         }  
 93       
 94         //rd  
 95         if( p1x+1<N && p2y+1<N ) {  
 96             p1x++;p2y++;  
 97             int sum = map[p1x][p1y]+map[p2x][p2y];  
 98             curMax += sum;  
 99             dfs(index+1);  
100             curMax -= sum;  
101             p1x--;p2y--;  
102         }  
103       
104         //dr  
105         if( p1y+1<N && p2x+1<N ) {  
106             p1y++;p2x++;  
107             int sum = map[p1x][p1y]+map[p2x][p2y];  
108             curMax += sum;  
109             dfs(index+1);  
110             curMax -= sum;  
111             p1y--;p2x--;  
112         }  
113     }  
114       
115     int main()  
116     {  
117         curMax = map[0][0];  
118         dfs(0);  
119         cout <<"搜索结果:"<<sumMax-map[N-1][N-1]<<endl;  
120         cout <<"动态规划结果:"<<dp()<<endl;  
121         return 0;  
122     }  
复制代码

2,有N个整数(数的大小为0-255)的有序序列,设计加密算法,把它们加密为K个整数(数的大小为0-255),再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列。设计加密解密算法。
有三个子问题:
1,N<=16,要求K<=16*N.
2,N<=16,要求K<=10*N.
3,N<=64,要求K<=15*N.





本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/archive/2012/12/13/2817039.html,如需转载请自行联系原作者

目录
相关文章
【 腾讯精选练习 50 题】07—最长公共前缀【简单】
【 腾讯精选练习 50 题】07—最长公共前缀【简单】
【 腾讯精选练习 50 题】05—回文数【简单】
【 腾讯精选练习 50 题】05—回文数【简单】
|
10月前
百度之星(题解)
百度之星(题解)
|
10月前
|
机器学习/深度学习 安全
2023年百度之星题解
2023年百度之星题解
|
小程序
百度2015年系统工程师笔试题
百度2015年系统工程师笔试题
度度熊找子串(百度2017秋招真题)
度度熊收到了一个只有小写字母的字符串S,他对S的子串产生了兴趣,S的子串为S中任意连续的一段。他发现,一些子串只由一种字母构成,他想知道在S中一共有多少种这样的子串。
210 0
度度熊找子串(百度2017秋招真题)
|
算法 Java
新鲜出炉,分享一道阿里的笔试题
Hello,大家好,我是鸭血粉丝~ 最近朋友出去面试某大厂,收到一题笔试题,阿粉看了下还是挺有意思的,跟大家分享一下。 首先我们先来看下题目的要求: 现在一个文件,包含大量的 sku 数据, 我们需要针对这些数据,需要完成三道题目。 这里就不完整介绍三道题目,今天就介绍前两道题目。
|
机器学习/深度学习 存储
|
算法 UED
百度霸屏?谁也霸不过百度
最近百度文库、知道、经验、拇指的百度排名很疯狂,尤其是文库。今天百度貌似有个大更新,这些百度自家产品被清理了绝大部分。
2031 0