Codility NumberSolitaire Solution
1.题目:
A game for one player is played on a board consisting of N consecutive squares, numbered from 0 to N − 1. There is a number written on each square. A non-empty zero-indexed array A of N integers contains the numbers written on the squares. Moreover, some squares can be marked during the game.
At the beginning of the game, there is a pebble on square number 0 and this is the only square on the board which is marked. The goal of the game is to move the pebble to square number N − 1.
During each turn we throw a six-sided die, with numbers from 1 to 6 on its faces, and consider the number K, which shows on the upper face after the die comes to rest. Then we move the pebble standing on square number I to square number I + K, providing that square number I + K exists. If square number I + K does not exist, we throw the die again until we obtain a valid move. Finally, we mark square number I + K.
After the game finishes (when the pebble is standing on square number N − 1), we calculate the result. The result of the game is the sum of the numbers written on all marked squares.
For example, given the following array:
A[0] = 1
A[1] = -2
A[2] = 0
A[3] = 9
A[4] = -1
A[5] = -2
one possible game could be as follows:
- the pebble is on square number 0, which is marked;
- we throw 3; the pebble moves from square number 0 to square number 3; we mark square number 3;
- we throw 5; the pebble does not move, since there is no square number 8 on the board;
- we throw 2; the pebble moves to square number 5; we mark this square and the game ends.
The marked squares are 0, 3 and 5, so the result of the game is 1 + 9 + (−2) = 8. This is the maximal possible result that can be achieved on this board.
Write a function:
int solution(int A[], int N);
that, given a non-empty zero-indexed array A of N integers, returns the maximal result that can be achieved on the board represented by array A.
For example, given the array
A[0] = 1
A[1] = -2
A[2] = 0
A[3] = 9
A[4] = -1
A[5] = -2
the function should return 8, as explained above.
Assume that:
- N is an integer within the range [2..100,000];
- each element of array A is an integer within the range [−10,000..10,000].
Complexity:
- expected worst-case time complexity is O(N);
- expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).
Elements of input arrays can be modified.
2.题目分析
这个题目写的超级复杂,其实说的内容很简单,就是我们掷骰子,1~6,代表向前走几步。那么一个棋盘的长度为N,每个节点上有一个数字,我们要通过掷色子刚好走到最后一个格子,在这个过程中会经过x个点。问题就是要我们输出这x个点最大可能的和是多少。
这个题如果不是看了关于dynamicprogramming的介绍的话一下子就蒙傻逼了。这个可能小多啊,跳到所有的正数是没话说,不过因为有负数,如何选择我跳入那个负数,避开哪个负数?如果有一长串的负数我如何跳入?更何况时间复杂度要求为O(N)。。这。。头好大。
但是有了dynamic这个算法,我们便可以换一个思路来向这个问题。
我们并不是要向后看,而是向前看。有点数学归纳法的赶脚。
首先,我们随便的站到位置W上。那么,如果要到达这个点,只能是从其前6个位置跳过来的,因为色子最大就到6呢。
那么如果问题到这个点结束,因为W位置上的数字是固定的,那么要跳到这个点时和为最大,则需要找到前六个点中的最大值即可。那么以此类推,最终会回到第0个位置。这个位置的最大值是固定的就是其本身。我们便可以递推的推出所有位置的最大值~
而且我们在每一个位置,内循环查找的最大次数为6,所以即使我有两层循环,那么时间复杂度也只是6N~=O(N)。线性。
我们还需要一个数组存储每一个位置的最大值需要N个空间。
3.代码
int maxLastSix(int A[],int pos)
{
int step=;
int result = A[pos-step];
while((pos-step)>=)
{
if(step>)
{
return result;
}
result = (result>A[pos-step])?result:A[pos-step];
step++;
}
return result;
} int solution(int A[], int N) {
// write your code in C99
int dp[N];
int i=; dp[]=A[]; for(i=;i<N;i++)
{
int temp = maxLastSix(dp,i);
dp[i]=A[i]+temp;
// printf("%d\n",temp);
} return dp[N-];
}
Codility NumberSolitaire Solution的更多相关文章
- codility flags solution
How to solve this HARD issue 1. Problem: A non-empty zero-indexed array A consisting of N integers i ...
- Solution of NumberOfDiscIntersections by Codility
question:https://codility.com/programmers/lessons/4 this question is seem like line intersections qu ...
- Solution to Triangle by Codility
question: https://codility.com/programmers/lessons/4 we need two parts to prove our solution. on one ...
- the solution of CountNonDivisible by Codility
question:https://codility.com/programmers/lessons/9 To solve this question , I get each element's di ...
- GenomicRangeQuery /codility/ preFix sums
首先上题目: A DNA sequence can be represented as a string consisting of the letters A, C, G and T, which ...
- *[codility]Peaks
https://codility.com/demo/take-sample-test/peaks http://blog.csdn.net/caopengcs/article/details/1749 ...
- *[codility]Country network
https://codility.com/programmers/challenges/fluorum2014 http://www.51nod.com/onlineJudge/questionCod ...
- *[codility]AscendingPaths
https://codility.com/programmers/challenges/magnesium2014 图形上的DP,先按照路径长度排序,然后依次遍历,状态是使用到当前路径为止的情况:每个 ...
- *[codility]MaxDoubleSliceSum
https://codility.com/demo/take-sample-test/max_double_slice_sum 两个最大子段和相拼接,从前和从后都扫一遍.注意其中一段可以为0.还有最后 ...
随机推荐
- 记一次与a标签相遇的小事
最近做的一个项目,按钮使用的是a标签做的,样子还不错.不过正是这个a标签把我坑死了,有一个场景是点击a标签去调后台服务,为了防止用户频繁点击按钮提交,在去请求后台服务的时候肯定要先把按钮的事件给禁止掉 ...
- easy_UI
引入js/css样式 <link rel="stylesheet" type="text/css" href="<%=path%>/ ...
- 让div盒子相对父盒子垂直居中的几种方法
div相对于父盒子垂直居中的几种方法,之前在网上看到很多种方法,确实说的很对,也很具体,但是我感觉对于初学者来说,一目了然是最重要的,所以,我把很高深的技巧,和很复杂的css样式都剔除掉,旨在让更多人 ...
- 用js实现动画效果核心方式
为了做好导航菜单,有时候需要在菜单下拉的时候实现动画效果,所以这几天就研究了研究如何用js实现动画效果,实现动画核心要用到两个函数,一个是setTimeOut,另一个是setInterval. 下边我 ...
- 常用linux手头命令
过滤ip ifconfig eth0|grep -oP "([0-9]{1,3}\.){3}[0-9]{1,3}"|sed -n '1p' ifconfig|sed -n '2p' ...
- [LeetCode] Word Frequency 单词频率
Write a bash script to calculate the frequency of each word in a text file words.txt. For simplicity ...
- html5 自定义标签取值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- IT培训行业揭秘(三)
关于培训班的课程是怎么设置的呢? 首先,国内也有几个水平不错的培训机构有自己课程研发体系,有自己的课程研发部门.我一直认为良心培训和黑心培训的区别就在这里,因为学生们所学的知识符不符合市场用功需求,就 ...
- 字节、字、bit、byte的关系
字 word 字节 byte 位 bit 字长是指字的长度 1字=2字节(1 word = 2 byte) 1字节=8位(1 byte = 8bit) 一个字的字长为16 一个字节的字长是8 bps ...
- Not Hello World
通常对于一门语言的学习,一般都是以"Hello,World!"开始的.但对于汇编语言的学习,输出这句话并不容易,首先得了解寄存器等硬件知识. 汇编语言要得以运行,首先要讲源文件编译 ...