동적 프로그래밍 DP [학교 팀 D # 2 적격]

그림 삽입 설명 여기

질문의 의미 : 나머지의 세 가지 상태는 같은 날 두 이벤트를 할 수 없어, 이벤트 B를 수행 이벤트 A를 할 수있다, 당신은 휴식 일의 최소 번호를 준비 할 수있는 방법을 부탁드립니다. 매일은 모든 것을 할 수 있습니다 할 수있는, 또는 하나 또는 단지 나머지를 할 수 있습니다

동적 프로그래밍 아이디어 :

당신이 일을 현재 할 수 있다면 사실, 분명히 그림자 상태의 전송이 질문은, 현재 최적의 솔루션은 현재 선택된 최적의 솔루션의 이전 최소 달라야합니다.
현재 이벤트가 할 같은 다음 최적의 솔루션의 최소 값은 최적의 솔루션과 휴식의 이벤트 B의 최적의 솔루션 전에 일을 수행하는 것입니다.

DP [I] [1] = 분 (DP [I-1] [0], DP [I-1] [2]).

다른 국가의 경우 그것도 이유입니다.

마지막 대답은 라인에서 가장 작은 선택하는 마지막 날에 세 가지 상태입니다.

사실,이 문제와이 문제의 상단의 버튼을 강제로 내가 무엇을 할 수 있는지에 관심이 블로그를보고, 금형이다.
그림 삽입 설명 여기

#include <iostream>
#include <vector>
#include <cstdio>
#include <map>
#include <climits>
#include <string>
#include <cmath>
#include <cstring>
#include <algorithm>
#define maxn 105
using namespace std;
typedef  long long ll;
static int inf = 0x3f3f3f3f;
int main()
{
    int n;
    cin>>n;
    int a[105];
    for(int i=1; i<=n; i++)
        cin>>a[i];
    vector<vector<int>>  dp(105,vector<int>(3,inf));
    dp[0][0]=0;
    dp[0][1]=0;
    dp[0][2]=0;//能做的事情无非三种
    for(int i=1; i<=n; i++)
    {
        if(a[i]==0)      //当前状态只能为0时,找出前面做0、做1,做2的最优解
        {
            dp[i][0]=min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]))+1;
        }
        if(a[i]==1)  //当前状态可以选择0或2时,找出对应之前的最优解
        {
            dp[i][0]=min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]))+1;  //当前
            dp[i][2]=min(dp[i-1][0],dp[i-1][1]);  
        }
        if(a[i]==2)
        {
            dp[i][0]=min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]))+1;
            dp[i][1]=min(dp[i-1][0],dp[i-1][2]);

        }
        if(a[i]==3)
        {
            dp[i][0]=min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]))+1;
            dp[i][2]=min(dp[i-1][0],dp[i-1][1]);
            dp[i][1]=min(dp[i-1][0],dp[i-1][2]);
        }
    }
    int minone=inf;
    for(int i=0;i<=3;i++)//最后一天在三种状态里面挑最小
    minone=min(minone,dp[n][i]);
    cout<<minone<<endl;
    return 0;
}

게시 35 개 원래 기사 · 원의 찬양 (23) · 전망 1865

추천

출처blog.csdn.net/qq_45492531/article/details/104466993