[동적 프로그래밍 질문 7] 주식을 사고 파는 가장 좋은 시기에는 동결 기간이 포함됩니다&& 주식을 사고 파는 가장 좋은 시기에는 취급 수수료가 포함됩니다

주식을 사고 파는 가장 좋은 시기에는 동결 기간이 포함됩니다.

링크: 동결 기간을 포함하여 주식을 사고 팔기에 가장 좋은 시기

정수 배열 가격이 주어지면 가격[i]는 i일의 주가를 나타냅니다.

최대 이익을 계산하는 알고리즘을 설계하십시오. 다음 제약 조건에 따라 가능한 한 많은 거래(주식을 여러 번 사고 팔기)를 완료할 수 있습니다.

주식을 팔고 나면 다음날 주식을 살 수 없습니다. (즉, 동결기간은 1일입니다.)
참고: 동시에 여러 거래에 참여할 수 없습니다(다시 구매하기 전에 이전 주식을 판매해야 합니다).

예시 1:
입력: 가격 = [1,2,3,0,2]
출력: 3
설명: 해당 거래 상태는 [매수, 매도, 기간 동결, 매수, 매도]입니다.

예시 2:
입력: 가격 = [1]
출력: 0

1. 상태 표현

이러한 종류의 문제에 대한 상태 표현은 일반적으로 두 가지 형식을 갖습니다.

  1. i. [i, j] 위치부터 시작,...;
  2. ii.시작 위치에서 시작하여 [i, j] 위치에 도달하는,...;

여기에서는 특정 포지션으로 끝나고 주제의 요구 사항에 따라 상태 표현을 정의하는 보다 일반적으로 사용되는 방법을 선택합니다.
특정 포지션으로 끝나면 세 가지 상태인
구매, 거래 가능( 재고 구매 가능), 냉동

그래서 우리는 2차원 배열을 정의합니다:

  1. dp[i][0]은 i번째 날이 끝난 후 "구매" 상태가 되며 이때 최대 수익을 의미합니다.
  2. dp[i][1]은 i번째 날이 끝난 후 "거래 가능" 상태가 되며 이때 최대 이익을 얻는다는 의미입니다.
  3. dp[i][2]는 i번째 날이 끝난 후 "동결 기간" 상태가 되며 이때 최대 수익을 의미합니다.

2. 상태 전이 방정식

세 주 간의 이전 방법을 통해 다음과 같은 결론을 내릴 수 있습니다.

여기에 이미지 설명을 삽입하세요.
상태 전이 방정식:

dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] -prices[i])
dp[i][1] = max(dp[i - 1][1], dp[i - 1][2])
dp[i][2] = dp[i - 1][0] + prices[i]

3. 초기화

세 가지 상태 모두 이전 위치의 값을 사용하므로 각 행의 첫 번째 위치를 초기화해야 합니다.

  1. dp[0][0]: 이때 '매수' 상태가 되려면 첫날 해당 주식을 사야 하므로 dp[0][0] = -prices[0];
  2. dp[0][1]: 아무것도 사용하지 않으므로 dp[0][1] = 0;
  3. dp[0][2]: 보유 주식이 없으면 매매 후 동결 기간이 되며, 이때 수입은 0이므로 dp[0][2]= 0

4. 양식 작성 순서
"상태 표시"에 따라 세 가지 양식을 함께 작성해야 하며 각 양식은 "왼쪽에서 오른쪽으로" 작성해야 합니다.

5. 반환값
세 가지 상태의 최대값을 반환합니다.

max(dp[0][n-1],max(dp[1][n-1],dp[2][n-1]))

암호:

int maxProfit(vector<int>& prices) {
    
    
        int n=prices.size();

        vector<vector<int>> dp(3,vector<int>(n));
        dp[0][0]=-prices[0];
        dp[1][0]=dp[2][0]=0;

        for(int i=1;i<n;i++)
        {
    
    
            dp[0][i]=max(dp[2][i-1]-prices[i],dp[0][i-1]);
            dp[1][i]=dp[0][i-1]+prices[i];
            dp[2][i]=max(dp[2][i-1],dp[1][i-1]);
        } 
        return max(dp[0][n-1],max(dp[1][n-1],dp[2][n-1]));
    }

여기에 이미지 설명을 삽입하세요.

수수료 포함 주식을 사고팔기에 가장 좋은 시기

링크: 수수료 포함 주식을 사고팔기에 가장 좋은 시기

가격[i]이 i일의 주가를 나타내는 정수 배열 가격이 주어지면 정수 수수료는 주식 거래에 대한 처리 수수료를 나타냅니다.

거래는 횟수 제한 없이 완료할 수 있지만 거래마다 수수료를 지불해야 합니다. 이미 주식을 구매한 경우 해당 주식을 팔 때까지 더 이상 주식을 구매할 수 없습니다.

얻은 이익의 최대값을 반환합니다.

참고: 여기에서 거래란 주식을 사고, 보유하고, 파는 전 과정을 의미하며, 각 거래마다 수수료만 지불하면 됩니다.

예시 1:
입력: 가격 = [1, 3, 2, 8, 4, 9], 수수료 = 2
출력: 8
설명: 달성할 수 있는 최대 이익:
여기서 구매 가격[0] = 1
여기서 판매 입찰 가격[ 3] = 8
여기서 구매 가격[4] = 4
여기서 판매 가격[5] = 9
총 이익: ((8 - 1) - 2) + ((9 - 4) - 2 ) = 8

예시 2:
입력: 가격 = [1,3,7,5,10,3], 수수료 = 3
출력: 6

1. 상태 표현

이러한 종류의 문제에 대한 상태 표현은 일반적으로 두 가지 형식을 갖습니다.

  1. i. [i, j] 위치부터 시작,...;
  2. ii.시작 위치에서 시작하여 [i, j] 위치에 도달하는,...;


여기서 우리는 상태 표현( i번째 날이 끝난 후의 상태)을 정의하기 위해 주제의 요구 사항과 결합된 특정 위치로 끝나는 보다 일반적으로 사용되는 방법을 선택합니다 . 특정 위치에서 종료되면 구매, 거래 가능(주식 구매 가능)
의 두 가지 상태를 분석할 수 있음을 알 수 있습니다.

질문에서 알 수 있듯이, 처리 수수료는 거래가 완료된 후에만 차감되므로, 우리는 주식을 판매한 후에 처리 수수료를 차감하도록 선택합니다.

그래서 우리는 2차원 배열을 정의합니다:

  1. dp[i][0]은 i번째 날이 끝난 후 "구매" 상태가 되며 이때 최대 수익을 의미합니다.
  2. dp[i][1]은 i번째 날이 끝난 후 "거래 가능" 상태가 되며 이때 최대 이익을 얻는다는 의미입니다.

2. 상태 전이 방정식

두 상태 사이의 전환을 살펴보면 다음과 같은 결과를 얻을 수 있습니다.

여기에 이미지 설명을 삽입하세요.

상태 전이 방정식:

dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] -prices[i])
 dp[i][1]=max(dp[i-1][0]+prices[i]-fee,dp[i-1][1]);

3. 초기화

이전 상태를 사용해야 하므로 첫 번째 위치를 초기화해야 합니다.
◦ dp[i][0]의 경우 현재 '매수' 상태이므로 dp[i0[0]= -prices[0]; ◦ dp[i][1]의 경우 현재
상태 이때 "재고 없음" 상태 이 상태에서는 아무것도 하지 않음으로써 최대의 이익을 얻을 수 있으므로 dp[i][1]= 0이다.

4. 양식 작성 순서는
의심할 바 없이 "왼쪽에서 오른쪽"이지만 두 양식을 함께 작성해야 합니다.

5. 반환 값은
"판매" 상태인 마지막 날의 최대 이익을 반환해야 합니다: dp[n-1][1];

암호:

  int maxProfit(vector<int>& prices, int fee) {
    
    
        int n=prices.size();

        vector<vector<int>> dp(n,vector<int>(2));

        dp[0][0]=-prices[0];//第一天手上有票
        dp[0][1]=0;//第一天手上没票

        for(int i=1;i<n;i++)
        {
    
    
            dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);
            dp[i][1]=max(dp[i-1][0]+prices[i]-fee,dp[i-1][1]);
        }

        return dp[n-1][1];
    }

여기에 이미지 설명을 삽입하세요.

Supongo que te gusta

Origin blog.csdn.net/m0_64579278/article/details/132199599
Recomendado
Clasificación