【演算法 in python | DP】子串和(乘積)最大
阿新 • • 發佈:2018-11-03
1. 最大子序和
給定一個整數陣列 nums
,找到一個具有最大和的連續子陣列(子陣列最少包含一個元素),返回其最大和。nums中有正有負。
class Solution: def maxSubArray(self, nums): res = [0 for i in range(len(nums))] res[0] = nums[0] for i in range(1,len(nums)): res[i] = max(res[i-1]+nums[i], nums[i]) return max(res)
2. 最大子序乘積
給定一個整數陣列 nums
,找出一個序列中乘積最大的連續子序列(該序列至少包含一個數)。nums中有正有負。
class Solution: def maxProduct(self, nums): max_res = [1 for i in range(len(nums))] min_res = [1 for i in range(len(nums))] max_res[0] = nums[0] min_res[0] = nums[0] for i in range(1, len(nums)): max_res[i] = max(max(max_res[i-1]*nums[i], min_res[i-1]*nums[i] ), nums[i]) min_res[i] = min(min(max_res[i-1]*nums[i], min_res[i-1]*nums[i] ), nums[i]) return max(max_res)
3. 合唱團
有 n 個學生站成一排,每個學生有一個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?
總結:列表a中按順序取k個值,滿足相鄰兩值位置差小於d,使得k個值乘積最大。(即最大子序乘積的變體。)
idea:DP, 維護兩個陣列,分別存最大值和最小值。
def maxmul(n,a, num_k, d): dpmax = [[0 for i in range(n)] for j in range(num_k)] dpmin = [[0 for i in range(n)] for j in range(num_k)] dpmax[0] = a #取1個學生,以第i個學生結尾的最大乘積即為該學生的值 dpmin[0] = a for i in range(0,n): for k in range(1,num_k):#取k個學生,以第i個學生結尾的最大乘積 for j in range(i-1,max(-1,i-d-1),-1):#不保證dp[k][i]真的取到了a中第i個元素,因此要遍歷 dpmax[k][i] = max(dpmax[k][i], max(dpmax[k-1][j]*a[i], dpmin[k-1][j]*a[i])) dpmin[k][i] = min(dpmin[k][i], min(dpmax[k-1][j]*a[i], dpmin[k-1][j]*a[i])) return max(dpmax[-1])
4. 罪犯轉移
C市現在要轉移一批罪犯到D市,C市有n名罪犯,按照入獄時間有順序,另外每個罪犯有一個罪行值,值越大罪越重。現在為了方便管理,市長決定轉移入獄時間連續的c名犯人,同時要求轉移犯人的罪行值之和不超過t,問有多少種選擇的方式(一組測試用例可能包含多組資料,請注意處理)?
總結:n個數存在列表val中,選擇連續c個,使得c個數之和不超過t,求能選出多少組c?
def find(n, t, c, val):
res = []
res.append(sum(val[0:c]))
for i in range(1,n-c+1):
res.append(res[i-1]-val[i-1] + val[i+c-1])
return len([i for i in res if i <=t ])