LC 알고리즘 질문: 동적 프로그래밍 dp

  1. 아름다운 배열
    1부터 N까지 N개의 정수가 있다고 가정합니다. 이 N개의 숫자로부터 배열이 성공적으로 구성되면 배열의 i번째 비트(1 <= i <= N)가 다음 두 조건 중 하나를 만족합니다. 우리는 이 배열을 아름다운 배열이라고 부릅니다. 상태:

i번째 위치의 숫자는 i로 나누어집니다.
i는 i번째 위치의 숫자로 나누어집니다
. 이제 정수 N이 주어지면 몇 개의 아름다운 배열을 구성할 수 있습니까?

방법 1: 상태 dp

  1. 경계를 벗어난 경로 수
  2. mxn 크기의 격자와 공이 주어졌습니다. 공의 시작 좌표는 [startRow, startColumn]입니다. 공을 네 방향으로 인접한 셀로 이동할 수 있습니다(그리고 그리드 경계를 넘어 그리드 외부에 도달할 수 있습니다). 공을 maxMove 횟수까지 이동할 수 있습니다.

5개의 정수 m, n, maxMove, startRow 및 startColumn이 주어지면 공을 경계 밖으로 이동할 수 있는 경로 수를 찾아 반환합니다.

방법 1: 경로 dp

  1. 학생 출석 기록 II는
    학생의 출석 기록을 문자열로 나타낼 수 있으며, 각 문자는 해당 날짜의 출석(결석, 지각, 출석)을 표시하는 데 사용됩니다. 기록에는 다음 세 문자만 포함됩니다:
    'A': 결석, 결석
    'L': 지각, 지각
    'P': 출석
    학생이 다음 두 가지 조건을 동시에 충족할 경우 출석 보상을 받을 수 있습니다.

학생의 결석('A')은 전체 출석을 기준으로 엄격히 2일 미만입니다.
학생들은 연속 3일 또는 연속 3일 이상 지각('L')을 할 수 없습니다.
출석 기록의 길이(회수)를 나타내는 정수 n이 주어집니다. 기록 길이가 n일 때 출석 보상을 받을 수 있는 기록 상황의 개수를 반환해주세요. 답이 클 수 있으므로 모듈로 109 + 7의 결과가 반환됩니다.

## 지정된 시간(또는 횟수) 내에 목적지에 도달하는 데 드는 최소 비용
lc787. K 역 내에서 가장 저렴한 항공편 환승
lc1928 지정된 시간 내에 목적지에 도달하는 데 드는 최소 비용
Method: dfs 순환 규칙

650. 키가 두 개만 있는 키보드
처음에는 메모장에 문자 'A'가 하나만 있었습니다. 이 메모장에서는 한 번에 두 가지 작업을 수행할 수 있습니다.
모두 복사: 이 메모장의 모든 문자를 복사합니다(일부 문자만 복사할 수는 없습니다).
붙여넣기: 마지막으로 복사한 문자를 붙여넣습니다.
숫자 n이 주어지면 메모장에 정확히 n개의 'A'를 출력하려면 최소 작업 수를 사용해야 합니다. n개의 'A'를 인쇄할 수 있는 최소 작업 수를 반환합니다.

629. 역순 쌍의 K 배열
두 개의 정수 n과 k가 주어지면 정확히 k개의 역순 쌍을 갖는 1부터 n까지의 숫자를 포함하는 서로 다른 배열의 수를 찾으세요.
역순 쌍의 정의는 다음과 같습니다: 배열의 i번째 및 j번째 요소에 대해 i < j 및 a[i] > a[j]이면 역순 쌍입니다. , 그렇지 않습니다.
답변이 클 수 있으므로 답변의 mod 109 + 7 값만 반환하면 됩니다.

375. 숫자를 맞춰보세요 II
우리는 추측 게임을 하고 있는데 게임의 규칙은 다음과 같습니다.

나는 1부터 n까지의 숫자를 선택한다.
내가 어떤 번호를 골랐는지 짐작하시겠죠?
올바른 숫자를 추측하면 게임에서 승리합니다.
당신이 틀리면 내가 고른 숫자가 당신의 숫자보다 크거나 작다는 것을 알려주고 계속해서 추측해야 합니다.
숫자 x를 추측하고 틀릴 때마다 x 금액의 현금을 지불합니다. 돈이 부족하면 게임에서 지게 됩니다.
특정 숫자 n이 주어지면 내가 선택한 숫자에 관계없이 승리를 보장하는 최소 금액의 현금을 반환합니다.

688. 체스판에 기사가 나올 확률 아이디어
: 동적 프로그래밍 f[step][i][j]는 i, j까지 걸어갈 확률을 나타냅니다. f[step][i][j]는 모두 f[step][ni][nj]/8을 8방향으로 전송하여 얻습니다. 트릭: 행과 열 위치에서 k 단계를 밟을 확률을 전체 체스판에서 행과 열 위치까지 k 단계로 변경합니다.

887. Egg Drop은
k개의 동일한 계란을 제공하며 1층부터 n층까지 n층의 건물을 사용할 수 있습니다.
0 <= f <= n을 만족하는 층 f가 있다고 알려져 있습니다. f보다 높은 층에서 떨어진 계란은 깨지고 f 층이나 그보다 낮은 층에서 떨어진 계란은 깨지지 않습니다.
각 작업마다 깨지지 않은 달걀을 가져다가 x(1 <= x <= n 만족) 층에서 떨어뜨릴 수 있습니다. 계란이 깨지면 다시 사용할 수 없습니다. 달걀을 떨어뜨린 후에도 깨지지 않으면 후속 작업에서 재사용할 수 있습니다.
f의 정확한 값을 결정하는 데 필요한 최소 작업 수를 계산하고 반환해 주시겠습니까?

아이디어: 얼핏 보면 2개로 나눌 수 있을 것 같지만 이 경우에는 k를 사용하지 않고, 2개로 나눌 때 계란을 조각조각 던지는 비용을 고려하지 않고 동적 프로그래밍을 사용할 수 있다. 이 문제의 경우 dp[k][n]은 현재 k개의 계란이 있고 n개 층에 계란을 던지는 최소 횟수를 나타냅니다.
x층에 계란을 던질 때:
계란이 깨지지 않으면 상태는 (k, nx)가 됩니다. 즉, 계란의 수는 변하지 않지만 답은 위의 nx층에만 있을 수 있습니다. 즉, 원래 문제를 크기 (k, nx)의 하위 문제로 축소했습니다.
계란이 깨지면 상태는 (k−1,x−1)이 됩니다. 즉, 계란이 하나 적습니다. , 그러나 우리는 그 답이 x층 아래의 x-1층에만 있을 수 있다는 것을 알고 있습니다. 즉, 원래 문제를 크기(k-1, x-1)의 하위 문제로 축소합니다.
dp(k,n)=1+ 1≤x≤nmin(최대(dp(k−1,x−1),dp(k,n−x))).
전체적인 복잡도는 O(k n n)이므로 현재 dp[k][n]을 계산하는 논리를 최적화해야 합니다. 원래는 층수를 열거했는데, 먼저 k가 고정되면 dp는 단조로워야 합니다. 점차적으로 이것은 이해할 수 있습니다.층이 높아질수록 작업 횟수가 늘어납니다. dp(k−1,x−1)과 dp(k,n−x)(첫 번째 차원의 k를 무시) 중 하나는 증가하고 다른 하나는 감소합니다(x가 증가할 때). 이때는 거의 그림과 같습니다. 아래 그림에서 여기에 이미지 설명을 삽입하세요.
이 둘 중 더 큰 최소값을 취하면 t1과 t2의 교차 위치를 구해야 합니다. 이 교차점의 양측은 이분법을 따르므로(그림 참조) 두 개로 나눌 수 있습니다. 또한 두 기능 모두 연속적이지 않고 이산적입니다. 예를 들어 정수 1, 2, 3만 가능합니다. 취해진다. 따라서 교차점은 정수가 아닐 수 있으며, 이때 교차점에 가장 가까운 x0과 x1만 이 두 점으로 현재 dp 값을 계산할 수 있습니다(자명함).

72. 편집 거리
word1과 word2라는 두 단어가 주어지면 word1을 word2로 변환하는 데 사용되는 최소 연산 수를 반환하십시오.
단어에 대해
문자 삽입,
문자 삭제,
문자 바꾸기

Case by Case로 논의한다.먼저 삽입과 삭제가 대칭이므로 삽입과 치환의 경우만 고려한다. 따라서 A 삽입, B 삽입, A 또는 B 수정의
세 가지 상황이 있습니다 . dp[i][j]는 A0, A1,...,Ai 및 B0, B1,...,Bj의 편집 거리를 나타냅니다. 위의 상황을 바탕으로 dp[i][j]로 변환하는 방법을 고려해보세요.

926. 문자열을 단조 증가하도록 뒤집기 이진
문자열이 일부 0(0이 아닐 수도 있음)과 일부 1(1이 없을 수도 있음)로 구성된 경우 문자열은 단조 증가합니다.
이진 문자열 s가 주어지면 0을 1로, 1을 0으로 바꿀 수 있습니다.
s를 단조롭게 증가시키는 최소 뒤집기 횟수를 반환합니다.

871. 최소 급유 횟수
dp[j]를 정의하여 j회 급유로 이동할 수 있는 최대 거리를 나타냅니다. dp 배열을 업데이트한 후 작은 첨자에서 큰 첨자로 이동합니다. dp[i]가 목표보다 큰 경우, 직접 반환됩니다.
dp 배열을 업데이트하는 방법은 무엇입니까? dp[0]=startfuel은 분명한데, 거리에 따라 각 주유소를 횡단하고, dp[i]가 주유소까지의 거리보다 큰지 여부에 따라 매번 dp i를 업데이트합니다 .

522. The Longest Special Sequence II는
본질적으로 LCS 테스트입니다. 이 질문은 문자열 중 하나가 다른 문자열의 하위 문자열인 경우 특수 문자열이 전혀 없다는 것을 먼저 알아야 합니다. 그리고 str이 다른 str의 하위 str이 아닌 경우 str의 특수 str은 그 자체입니다. 이것을 알고 있다면 두 번 순환하십시오.

873. 가장 긴 피보나치 부분 수열의 길이인
fibonacci는 두 숫자로 결정됩니다: f[i][j]: arri는 아래쪽에서 첫 번째 숫자이고, arrj는 아래쪽에서 두 번째 숫자이며, 수열의 길이입니다. 는 밑에서 두 번째 숫자로 세 개의 숫자를 구하여 기록할 수 있으며 arr[i]부터 i까지의 맵을 구하고 마지막에서 세 번째 숫자의 인덱스를 구하면 전달 방정식은 다음과 같다. 획득.

추천

출처blog.csdn.net/weixin_45719581/article/details/119740821