[编程题] 大富翁游戏
大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步。求玩家走到第n步(n<=骰子最大点数且是方法的唯一入参)时,总共有多少种投骰子的方法。
输入描述:
输入包括一个整数n,(1 ≤ n ≤ 6)
输出描述:
输出一个整数,表示投骰子的方法
输入例子1:
6
输出例子1:
32
分析:
类似于变态青蛙跳台阶。设走到第n步,有f(n)种走法,可以拆分成:第一次走1步,走法为f(n-1);第1次走2步,等等。。。
所以,就有 f(n) = f(n-1) + f(n-2) + ...+ f(1) = f(n-1) *2 = f(2)*2*2 = f(1) * 2**(n-1)
易知 f(1) = 1
n = int(raw_input())
print 2**(n-1)
[编程题] 拼凑钱币
给你六种面额 1、5、10、20、50、100 元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数。
输入描述:
输入包括一个整数n(1 ≤ n ≤ 10000)
输出描述:
输出一个整数,表示不同的组合方案数
输入例子1:
1
输出例子1:
1
分析:
问题是要求不同硬币的组合方案数。假设d[sum]表示金额sum的组合数,那么可以根据sum是否使用某种硬币coins[j],分解为
d[sum] = d[sum]+d[sum-coins[j]]
n = int(raw_input())
coins = [1, 5, 10, 20, 50, 100]
d = [0 for i in range(n+1)]
d[0] = 1
for i in range(n+1):
for j in range(len(coins)):
if i>=coins[j]:
d[i] += d[i-coins[j]]
print d[n]
[编程题] 最大矩形面积
时间限制:1秒
空间限制:32768K
给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。 入参h为一个整型数组,代表每个柱子的高度,返回面积的值。
输入描述:
输入包括两行,第一行包含一个整数n(1 ≤ n ≤ 10000) 第二行包括n个整数,表示h数组中的每个值,h_i(1 ≤ h_i ≤ 1,000,000)输出描述:
输出一个整数,表示最大的矩阵面积。输入例子1:
6
2 1 5 6 2 3
输出例子1:
10
n = int(raw_input())
arr = map(int, raw_input().split())
arr.append(0)
stack = [-1]
ans = 0
for i in range(n+1):
while arr[i] < arr[stack[-1]]:
h = arr[stack.pop()]
w = i - stack[-1] -1
ans = max(ans, h*w)
stack.append(i)
arr.pop()
print ans
[编程题] 最长公共连续子串
时间限制:1秒
空间限制:32768K
给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。
输入描述:
输入为两行字符串(可能包含空格),长度均小于等于50.输出描述:
输出为一个整数,表示最长公共连续子串的长度。输入例子1:
abcde abgde输出例子1:
2
def find_lcsubstr(s1, s2):
m=[[0 for i in range(len(s2)+1)] for j in range(len(s1)+1)]
mmax=0
p=0
for i in range(len(s1)):
for j in range(len(s2)):
if s1[i]==s2[j]:
m[i+1][j+1]=m[i][j]+1
if m[i+1][j+1]>mmax:
mmax=m[i+1][j+1]
p=i+1
return mmax
str1 = raw_input()
str2 = raw_input()
if __name__ == '__main__':
print find_lcsubstr(str1, str2)