[CSDN Competition - Issue 10] 모든 문제 해결 방법에 대한 생각 및 요약

목차

1. 곰 아이의 방문

2. 계단 이용

3. 브래킷 컬러링

네, 물을 좋아하는 개구리


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입니다.

다음 코드 참조:

[3.29 Baidu 서면 테스트 프로그래밍 분석] CodeForces 149D 브래킷 색상 지정 문제 dp+dfs good question_with you ^_^의 블로그-CSDN 블로그 제목 주어진 브래킷 순서 지정, 브래킷 색상 지정, 색상 지정을 위한 세 가지 요구 사항 1 . 배색은 색 없음, 빨강, 파랑 3가지 뿐입니다 2. 각 괄호 쌍은 그 중 하나만 채색해야 합니다 3. 인접한 괄호 두 개는 같은 색으로 채색할 수 없으며 둘 다 채색할 수 없습니다. 0-len-1 간격에 얼마나 많은 색 구성표가 있는지 명백한 간격 DPdp[l][r][i][j]는 lr 간격의 양쪽 끝에 색상이 i와 j인 구성표의 수를 의미합니다. are 0은 착색 없음, 1은 빨간색, 2 파란색을 나타냅니다. lr 간격의 경우 3가지 경우가 있습니다.

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)을 사용합니다. 다음 블로그 게시물을 참조하여 시작할 수 있습니다.

Interval dp_阿阿安's Blog-CSDN Blog_Interval dp 시작하기 1. Interval dp란 이름에서 알 수 있듯이 Interval dp는 간격에서 동적 프로그래밍을 수행하여 간격에서 최적의 솔루션을 찾는 것입니다. dp 알고리즘은 주로 작은 구간에서 최적해를 병합하여 전체 큰 구간에서 최적해를 구한다. 2. 핵심 아이디어 구간에서 최적의 솔루션을 찾으라는 요청을 받았기 때문에 이 구간을 작은 구간으로 나누고 각각의 작은 구간에 대한 최적 솔루션을 푼 다음 작은 구간을 병합하여 큰 구간을 얻습니다. 그래서 코드 구현의 관점에서 Interval length len을 각 시간으로 나눈 작은 간격의 길이(짧은 것에서 긴 것으로 그리고 연속적으로 병합됨)로 열거할 수 있고, 내부 계층은 이 길이 아래에서 가능한 것을 열거합니다... : //blog.csdn.net/qq_40772692/article/details/80183248


네, 물을 좋아하는 개구리

항상 물놀이를 좋아하는 개구리는 어느 날 친구를 만나러 강을 건너게 됩니다. 강 수로는 가시가 많은 알 수 없는 생물들로 가득 차 있는 것으로 알려져 있으며, 통과할 수 있는 유일한 길은 길이가 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;
        }
    }
}

추천

출처blog.csdn.net/qq_40506723/article/details/127950026