목차
1. 곰 아이의 방문
길이가 n인 정수 시퀀스 A가 존재하는 것으로 알려져 있습니다. A의 모든 요소는 내림차순으로 정렬됩니다. 이제 시퀀스를 반전시키는 작업을 수행합니다. 시퀀스 A에서 반전된 하위 시퀀스를 찾으십시오.
문제에 대한 나의 해결책(모든 테스트 사례 통과):
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, arr):
result = []
# 保存右值
max = 0
# 保存左值
min = 0
next = 0
for item in arr:
if next>item and item>max:
max=next
min=item
elif next<min and item>max:
min=next
next=item
result.append(str(min))
result.append(str(max))
if len(result)==0:
result=["0","0"]
return result
if __name__ == "__main__":
n = int(input().strip())
arr = [int(item) for item in input().strip().split()]
sol = Solution()
result = sol.solution(n, arr)
print(" ".join(result))
입력 설명: 첫 번째 줄에 정수 n 입력, 두 번째 줄에 n 정수 입력(1<=n<=1000)
출력 설명 : 반전된 수열의 좌우 값을 출력, 아니면 0 0 입력
예를 들어:
2. 계단 이용
이제 계단 구간이 생겼습니다. 다리 길이에 따라 한 번에 1개 또는 2개의 계단을 걸을 수 있습니다. 목적지 층에 도달하려면 n개의 계단을 걸어야 한다고 알려져 있습니다. 계산 방법을 구현하십시오. 목적지 층에 도달하는 데 걸리는 시간 시나리오 수.
내 문제 해결 아이디어:
class Solution:
def __init__(self) -> None:
pass
def solution(self, n):
if isinstance(n, int) and n > 0:
basic_dic = {1: 1, 2: 2}
if n in basic_dic.keys():
return basic_dic[n]
else:
return self.solution(n - 1) + self.solution(n - 2)
else:
return False
if __name__ == "__main__":
n = int(input().strip())
sol = Solution()
result = sol.solution(5)
print(result)
입력과 출력:
비재귀적이라면 어떻게 달성할 수 있습니까? ——재귀적 방법
유사한 질문: 건물에는 N개의 계단이 있고 토끼는 매번 1, 2 또는 3개의 계단을 점프할 수 있습니다. 총 몇 개의 방법이 있습니까?
def solution(n):
if isinstance(n,int) and n > 0:
# 如果台阶数总共有3个,那么有4种走法:
# 1 1 1
# 1 2
# 2 1
# 3
# 如果n为4,有7种走法
# 1 3
# 3 1
# 22
# 1111
# 211
# 121
# 112
# 有4级台阶
# temp=1,h1=2,h2=4,h3=1+2+4,返回7
# 有5级台阶
# temp=1,h1=2,h2=4,h3=1+2+4
# temp=2,h1=4,h2=1+2+4,h3=2+4+1+2+4,返回13
h1,h2,h3 = 1,2,4
basic_dic = {1:1,2:2,3:4}
if stairs in basic_dic.keys():
return basic_dic[n]
else:
while n>=4:
temp = h1
h1 = h2
h2 = h3
h3 = temp + h1 + h2
n-=1
return h3
else:
return False
# 总结:
# 如果一次可以走1、2或3步的话,那么:第N级楼梯的走法是N-1级楼梯的走法+N-2级楼梯的走法+N-2级楼梯的走法
3. 브래킷 컬러링
Xiao Yijiang은 또 다른 괄호를 받았습니다. 괄호는 엄격하게 일치합니다. 이제 괄호를 색칠합니다. 채색에는 세 가지 요구 사항이 있습니다. 1. 채색 없음, 빨간색, 파란색의 세 가지 색 구성표만 있습니다. 2. 각 쌍의 괄호 중 하나만 색칠해야 합니다. 3. 인접한 두 괄호는 같은 색으로 칠할 수 없지만 무채색은 가능합니다. 괄호를 색칠하기 위한 옵션은 몇 가지입니까? 답은 모듈로 1000000007입니다.
다음 코드 참조:
import sys
s = input()
num = strlen = len(s)
tmp = [0 for i in range(num)] # 记录左括号的位置
match = [0 for i in range(num)] # 记录右匹配的位置
dp = [[[[0 for i in range(3)] for i in range(3)] for i in range(num)] for i in range(num)]
# 由内向外建立多维dp 数组的形式
# dp=np.arange(3*3*num*num).reshape(num,num,3,3)
# 0代表不上色,1代表上红色,2代表上蓝色
mod = 1000000007
def getmatch(len):
p = 0
for i in range(len):
if (s[i] == '('):
tmp[p] = i
p = p + 1
else:
match[i] = tmp[p - 1]
match[tmp[p - 1]] = i
p = p - 1
def dfs(l, r):
if (l + 1 == r): # 边界条件
dp[l][r][0][1] = 1
dp[l][r][1][0] = 1
dp[l][r][0][2] = 1
dp[l][r][2][0] = 1
return
if (match[l] == r): # 如果匹配的话方案数相加
dfs(l + 1, r - 1)
for i in range(3):
for j in range(3):
if (j != 1):
dp[l][r][0][1] = (dp[l][r][0][1] + dp[l + 1][r - 1][i][j]) % mod;
if (i != 1):
dp[l][r][1][0] = (dp[l][r][1][0] + dp[l + 1][r - 1][i][j]) % mod;
if (j != 2):
dp[l][r][0][2] = (dp[l][r][0][2] + dp[l + 1][r - 1][i][j]) % mod;
if (i != 2):
dp[l][r][2][0] = (dp[l][r][2][0] + dp[l + 1][r - 1][i][j]) % mod;
return
else: # 否则方案数相乘,乘法原理
p = match[l]
dfs(l, p)
dfs(p + 1, r)
for i in range(3):
for j in range(3):
for k in range(3):
for q in range(3):
if not ((k == 1 and q == 1) or (k == 2 and q == 2)):
dp[l][r][i][j] = (dp[l][r][i][j] + (dp[l][p][i][k] * dp[p + 1][r][q][j]) % mod) % mod
if __name__ == '__main__':
getmatch(strlen)
dfs(0, strlen - 1)
ans = 0
for i in range(3):
for j in range(3):
ans = (ans + dp[0][strlen - 1][i][j]) % mod;
sys.stdout.write(str(ans))
이 질문은 대괄호 일치에 속하며 일정 간격으로 동적 프로그래밍(DP)을 사용합니다. 다음 블로그 게시물을 참조하여 시작할 수 있습니다.
네, 물을 좋아하는 개구리
항상 물놀이를 좋아하는 개구리는 어느 날 친구를 만나러 강을 건너게 됩니다. 강 수로는 가시가 많은 알 수 없는 생물들로 가득 차 있는 것으로 알려져 있으며, 통과할 수 있는 유일한 길은 길이가 L인 직선입니다. 직선에 무작위로 분포된 m개의 돌이 있습니다. 개구리의 최소 점프 거리는 s이고 최대 점프 거리는 t입니다. 개구리는 가능한 한 적은 돌을 밟고 싶어하는데, 강을 건널 때 적어도 몇 개의 돌을 밟을까요?
설명 입력:
여러 세트의 데이터 입력, 각 데이터 세트:
첫 번째 줄에 정수 L(1<=L<=1e9)을 입력합니다.
두 번째 줄에 s, t, m(1<=s<=t<=10, 1<=m<=100) 정수 3개를 입력합니다.
세 번째 줄은 m개의 다른 정수를 입력하여 숫자 축에서 m개의 돌의 분포 위치를 나타냅니다.
각 행의 인접한 모든 정수는 공백으로 구분됩니다.
출력 설명:
개구리가 강을 건널 때 밟을 돌의 최소 개수를 출력하고
각 입력 데이터 세트에 해당하는 출력 결과는 별도의 행에 있습니다.
입력 샘플:
10
2 3 5
2 3 5 6 7
샘플 출력:
2
다음 코드는
https://bbs.csdn.net/topics/607060820 https://bbs.csdn.net/topics/607060820 에서 가져온 것입니다.
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
void solution(int L, int ar[], int arr[]);
void move(int s, int count, int L, int ar[], int arr[]);
int res=INT_MAX;
int main(){
int L;
int ar[3];
int *arr;
scanf("%d",&L);
for(int i=0;i<3;i++){
scanf("%d",&ar[i]);
}
arr=malloc(sizeof(int)*ar[2]);
for(int i=0;i<ar[2];i++){
scanf("%d",&arr[i]);
}
solution(L,ar,arr);
printf("%d",res);
}
void solution(int L, int ar[], int arr[]){
int s=0;
int count=0;
move(s, count, L, ar, arr);
}
void move(int s, int count, int L, int ar[],int arr[]){
if(s<L){
for(int i=0;i<ar[2];i++){
if(s==arr[i]){
count++;
}
}
for(int j=ar[0];j<=ar[1];j++){
move(s+j,count,L,ar,arr);
}
// move(s+ar[0],count,L,ar,arr);
// move(s+ar[1],count,L,ar,arr);
}else{
if(res>count){
res=count;
}
}
}