**最大二叉树:**
nums = list(map(int, input().split()))
res = []
def build(lst):
if not lst: return
m, i = max(lst), lst.index(max(lst))
res.append(str(m))
l, r = lst[:i], lst[i+1:]
if not l and not r: return
build(l) if l else res.append("null")
build(r) if r else res.append("null")
build(nums)
print(' '.join(res) if res else "null")
**寻找多数:**
n = int(input())
nums = list(map(int, input().split()))
def f(a):
if len(a)==1:
return a[0]
l,r = f(a[:len(a)//2]), f(a[len(a)//2:])
return l if a.count(l) > a.count(r) else r
print(f(nums))
**最大子序和:**
input()
a = list(map(int, input().split()))
c = m = a[0]
for x in a[1:]: c = max(x, c + x); m = max(m, c)
print(m)
**换硬币:**
N = int(input())
dp = [0] + [N+1]*N
for i in range(1, N+1):
for c in [2,5,7]:
if i>=c: dp[i] = min(dp[i], dp[i-c]+1)
print(dp[N] if dp[N]<=N else -1)
**走网格:**
m, n = map(int, input().split())
dp = [1] * n
for _ in range(1, m):
for j in range(1, n): dp[j] += dp[j-1]
print(dp[-1])
**爬楼梯:**
n = int(input())
a, b = 1, 2
for _ in range(n-1): a, b = b, a+b
print(a)
**背包问题:**
n, c = map(int, input().split())
w = list(map(int, input().split()));
v = list(map(int, input().split()));
dp = [0]*(c+1)
for i in range(n): [dp.__setitem__(j, max(dp[j], dp[j-w[i]]+v[i])) for j in range(c, w[i]-1, -1)]
print(dp[c])
**最长回文子串:**
s = input(); n = len(s);
dp = [[i==j for j in range(n)] for i in range(n)]
st, ml = 0, 1
for j in range(1, n):
for i in range(j):
if s[i]==s[j] and (j-i<3 or dp[i+1][j-1]):
dp[i][j] = True
if j-i+1>ml: ml, st = j-i+1, i
print(s[st:st+ml])
**目标和:**
nums = list(map(int, input().split()));
t = int(input()); n = len(nums)
d = {}
def f(i, c):
if i == n: return 1 if c == t else 0
if (i, c) in d: return d[(i, c)]
r = f(i+1, c+nums[i]) + f(i+1, c-nums[i]); d[(i, c)] = r; return r
print(f(0, 0))
**电话号码的字母组合:**
import itertools
mp = {"2": "abc", "3": "def", "4": "ghi", "5": "jkl", "6": "mno", "7": "pqrs", "8": "tuv", "9": "wxyz"}
s = input().strip()
res = ["".join(p) for p in itertools.product(*[mp[c] for c in s])] if s else []
print("[" + ", ".join(res) + "]")
**优美的排列:**
n = int(input())
def f(p, k):
if k > n: return 1
r = 0
for i in range(1, n+1):
if i not in p and (i%k==0 or k%i==0): r += f(p+[i], k+1)
return r
print(f([],1))
**组合:**
n, k = map(int, input().split())
def b(s, p):
if len(p) == k: print(" ".join(map(str, p))); return
for i in range(s, n+1): b(i+1, p+[i])
b(1, [])
**整数拆分:**
n = int(input())
dp = [0]*(n+1); dp[2] = 1
for i in range(3, n+1):
for j in range(1, i): dp[i] = max(dp[i], j*(i-j), j*dp[i-j])
print(dp[n])
**找假币:**
import sys
d = sys.stdin.read().split()
n = int(d[0])
c = list(map(int, d[1:1+n]))
def f(l, r):
if l==r: return l+1
if r-l==1: return l+1 if c[l]<c[r] else r+1
g = (r-l+1)//3
m1, m2 = l+g, l+2*g
s1, s2 = sum(c[l:m1]), sum(c[m1:m2])
return f(l, m1-1) if s1<s2 else f(m1, m2-1) if s1>s2 else f(m2, r)
print(f(0, n-1))
**分割等和子集:**
import sys
d=sys.stdin.readline().split()
if not d or (s:=sum(map(int,d)))%2:print("false");exit()
dp=[1]+[0]*(s//2)
for x in map(int,d):
for j in range(s//2,x-1,-1):dp[j]|=dp[j-x]
print("true" if dp[s//2] else "false")
**三角形的最大周长:**
import sys
a = sorted(map(int, sys.stdin.readline().split()))
for i in range(len(a)-1,1,-1):
if a[i-2] + a[i-1] > a[i]:
print(a[i-2]+a[i-1]+a[i]);
exit()
print(0)
1.最大二叉树
2.寻找多数
3.最大子序和
4.换硬币
5.走网格
6.爬楼梯
7.背包问题
8.最长回文子串
9.目标和
10.电话号码的字母组合
11.优美的排列
12.组合
13.整数拆分
14.找假币
15.分割等和子集
16.三角形的最大周长