defgetBlowHeight(cur_wh,k): # 计算出在目前状况下从k图到填满cur行的【k+j】处的行高 while k<N and cur_wh[0]<M: add(cur_wh,k) k+=1 # 最后下标等于【k+j+1】处,即新的一行 # 将该行行高与【k+j+1】处后续行高相加并返回 return cur_wh[1]+dp[k]
if __name__=='__main__': M, N = map(int,input().strip().split()) for i inrange(N): a.append(list(map(int,input().strip().split()))) #初始化dp数组,即从i张图片新起一行填到最后一行的这部分行高 for i inrange(N-1, -1, -1): dp[i]=getBlowHeight([0, 0], i) h=0#累计高度 min_h=1e7 cur_wh=[0,0] for i inrange(N):#计算去除i后 h+以i+1开始的行高 min_h=min(min_h,h+getBlowHeight(cur_wh[:],i+1))#记录最小高度 #更新累计高度 add(cur_wh,i) if cur_wh[0] == M: # 当前行已填满,另起一行 h += cur_wh[1] cur_wh = [0, 0] print(min_h)
classSolution: deflongestPalindrome(self, s: str) -> str: iflen(s)<2: return s maxlen=1 indexBegin=0 #初始化dp数组 dp=[[Falseif i!=j elseTrue for i inrange(len(s))] for j inrange(len(s))] #只需要判断≥2的子串,并且对于字串内部子串只用判断该子串≥4(即(j-1)-(i+1)+1>=2)的情况 for j inrange(1,len(s)): for i inrange(0,j): if s[i]==s[j]: if j-i>=3and dp[i+1][j-1]!=False: dp[i][j]=True elif j-i<3: dp[i][j]=True else:continue if maxlen<j-i+1: indexBegin=i maxlen=j-i+1 return s[indexBegin:indexBegin+maxlen]
for i inrange(N): ctn[A[i]]+=1 # 若k=0,可直接计数有多少种不同的分数 ifnot K: print(sum(1for item in ctn if item>0)) # 否则分成k个等差数列分别计算 else: ans = 0#最终结果 dp=[]#动态规划的数组 series=[]#存放差值为k的等差数列的对应分数个数 for i inrange(K): for j inrange(i,max(A)+1,K):# 剩下的数字不可能差值为k series.append(ctn[j]) for j inrange(len(series)): if j==0: dp.append(series[0])#初始默认选择series[0] elif j == 1: dp.append(max(dp[j-1],series[j])) else: dp.append(max(dp[j-1],series[j]+dp[j-2])) ans+=dp[-1] series=[] dp=[] print(ans)
import math n,length=map(int,input().split()) ls=[] for i inrange(n): ls.append(list(map(int, input().split()))) # 找时间的区间 ls.sort() lt=ls[0][0] rt=pow(10,9)*2 while lt<rt: mid=math.floor((lt+rt)/2) # 这里注意一定要判断阀门是否开启 cover=[[every_ls[0]-(mid-every_ls[1]),every_ls[0]+(mid-every_ls[1])] \ for every_ls in ls if mid>=every_ls[1]] cover.sort() iflen(cover) == 0or cover[0][0]>1: lt=mid+1 continue r=cover[0][1] # 判断是否覆盖完,每个左小于当前的r for j inrange(1,len(cover)): if cover[j][0]>r+1:#这里注意是相接的管道! break else: r=max(cover[j][1],r) if r<length: lt=mid+1# 判断r的大小即可 # 判断是否满足右 else: rt=mid print(rt)
import re classSolution(object): defmyAtoi(self, s): """ :type s: str :rtype: int """ pattern = r"^[\+\-]?\d+" result = int(*re.findall(pattern, s.lstrip())) min = -2**31 max = 2**31 -1 if result>max: returnmax elif result<min: returnmin else: return result
classSolution: defisPalindrome(self, x: int) -> bool: x=str(x) flag=0 # 从中间扩散,并且为奇数时不用判断中心的字符 for i inrange(len(x)//2): if x[i]!=x[len(x)-i-1]: flag=1 break if flag==1:returnFalse returnTrue
''' x = str(x) return x == ''.join(list(reversed(x))) ''' # return str(x) == str(x)[::-1]
双指针
盛最多的水
本来这道题想直接暴力曲线救国的,结果内存不够……
1 2 3 4 5 6 7 8
import itertools classSolution: defmaxArea(self, height: List[int]) -> int: # 两个要最远,且最高 height_with_id=list(enumerate(height)) matrix=list(itertools.combinations(height_with_id,2)) volum=[abs(line[0][0]-line[1][0])*min(line[0][1],line[1][1]) for line in matrix] returnsorted(volum)[-1]
import math n=int(input()) # 一定要保留前置0 x=int("1"+input()) y=int("1"+input()) # 退位/正常/进位 actions=[-1,0,1] fhNum=[x//10 + action1 for action1 in actions] minMove=[abs(x%10-y%10 - action1*10) for action1 in actions] y=y//10 for i inrange(1,n): thisTonum=y%10 y=y//10 thisMinMove=[math.inf for action in actions] thisFhNum=[math.inf for action in actions] for actionj in actions: nowNum=fhNum[actionj+1]%10 for actioni in actions: thisMove=abs(nowNum-thisTonum-actioni*10)+minMove[actionj+1] if thisMinMove[actioni+1]>thisMove: thisMinMove[actioni+1]=thisMove thisFhNum[actioni+1]=fhNum[actionj+1]//10 + actioni minMove=thisMinMove fhNum=thisFhNum print(int(min(minMove)))