标签:优先 怎么 队列 数组中的逆序对 link 快速排序 研究 背包 打印
微信公众号:Jerry的算法和NLP
小区花园里有n个入口,现在要修一些路,要求每个入口只能有一条路,且每条路之间互不相交,求输入为n的时候有几条路
这道题目主要考察的知识点为动态规划
动态规划主要就是要找准它的转移方程和base case以及目标
题目中提到,N是一个输入为2-1000的偶数
先找base case:
N=2 dp[2]=1 只有一条路 那么只有一种情况 这个好理解
N=4 dp[4]=2
N=6 dp[6]=5
当N=8的时候,怎么分析?
现在把每个门都标上了号码牌,我们假设我们从1开始看。
1一开始可以和 2或者 8 相连,那么剩下了6个门,那么剩下六个门连通的可能总数为dp[6](前面已经计算了)
1可以和7相连吗?不可以,因为这样8无论如何都会使得他们相交
所以我们必须隔两个门取。
1接下来和 2+2=4 或者 8-2=6 相连 当1和4相连的时候 剩下的六个门组合为dp[2]*dp[4]
此时 1 再和 4+2=6 或者 6-2=4 相连 此时已经发生了重复计算的情况,设置好跳出条件即可
先锁定一个门(假设为1),从两端开始 先和距离为1的门相连,然后距离为3 距离为5直至发生重复计算跳出循环
或者从一端开始直至绕了一圈回到1这个门的时候跳出循环
1a=int(input())
2dp=[0 for i in range(a+1)]
3dp[0]=0
4dp[2]=1
5dp[4]=2
6dp[6]=5
7for i in range(8,a+2,2):
8 for j in range(i-2,0,-2):
9 if j<i-j-2:
10 break
11 else:
12 if j==i-2:
13 dp[i]+=dp[i-2]*2
14 elif j==i-2-j:
15 dp[i]+=dp[j]*dp[j]
16 else:
17 dp[i]+=dp[j]*dp[i-2-j]*2
18print(dp[a])
2048游戏是一个44的矩阵,用户可以按上下左右4个方向键让所有的方块向同个方向运动,两个相同数字方块撞一起之后合并成为他们的和,每次操作之后随机生成个2或者4合并规则:相邻会撞的两个数字合并且一个位置只会触发一次合并,且优先合并移动方向顶部的位置
比如【2,2,2,2】合并后【0,0,4,4】
【0,2,2,2】合并后【0,0,2,4】
输入第一行是用户按下的方向键,1代表上,2代表下,3代表左,4代表右接下来是一个44的矩阵,空格分割,0代表该位置没有数字
这个题目其实就是考察对边界条件的判定和对两数之间的值是否相等的判定
1com = int(input())
2l=[]
3for _ in range(4):
4 l.append(list(map(int,input().split())))
5
6if com == 1:
7 for i in range(3, 0, -1):
8 for j in range(4):
9 if l[i-1][j] == l[i][j]:
10 l[i][j] = 0
11 l[i-1][j] *= 2
12
13 for k in range(3, 0, -1):
14 if l[k-1][j] == 0 and l[k][j] != 0:
15 l[k-1][j] = l[k][j]
16 l[k][j] = 0
17 if l[k-1][j] == l[k][j]:
18 l[k-1][j] *= 2
19 l[k][j] = 0
20
21elif com == 2:
22 for i in range(0, 3, 1):
23 print(i)
24 for j in range(4):
25 if l[i + 1][j] == l[i][j]:
26 l[i][j] = 0
27 l[i + 1][j] *= 2
28
29 for k in range(0, 3, 1):
30 if l[k + 1][j] == 0 and l[k][j] != 0:
31 l[k + 1][j] = l[k][j]
32 l[k][j] = 0
33 if l[k + 1][j] == l[k][j]:
34 l[k + 1][j] *= 2
35 l[k][j] = 0
36elif com == 3:
37 for i in range(4):
38 print(i)
39 for j in range(3, 0, -1):
40 if l[i][j - 1] == l[i][j]:
41 l[i][j] = 0
42 l[i][j - 1] *= 2
43
44 for k in range(3, 0, -1):
45 if l[i][k - 1] == 0 and l[i][k] != 0:
46 l[i][k - 1] = l[i][k]
47 l[i][k] = 0
48 if l[i][k - 1] == l[i][k]:
49 l[i][k - 1] *= 2
50 l[i][k] = 0
51
52elif com == 4:
53 for i in range(4):
54 print(i)
55 for j in range(0, 3, 1):
56 if l[i][j + 1] == l[i][j]:
57 l[i][j] = 0
58 l[i][j + 1] *= 2
59
60 for k in range(0, 3, 1):
61 if l[i][k + 1] == 0 and l[i][k] != 0:
62 l[i][k + 1] = l[i][k]
63 l[i][k] = 0
64 if l[i][k + 1] == l[i][k]:
65 l[i][k + 1] *= 2
66 l[i][k] = 0
67
68for i in range(4):
69 print(" ".join(map(str, l[i])))
2020大厂笔试 | 网易提前批(1)
2020大厂笔试 | 网易提前批(2)
2020大厂真题 | 腾讯笔试
背包九讲(1)0/1背包问题
背包九讲(2)完全背包问题
剑指offer刷题交流群
扫码添加微信,一定要备注研究方向+地点+学校+昵称(如机器学习+上海+上交+汤姆),只有备注正确才可以加群噢。
▲长按加群
标签:优先 怎么 队列 数组中的逆序对 link 快速排序 研究 背包 打印
原文地址:https://blog.51cto.com/15054042/2564188