질문의 의미 : 나머지의 세 가지 상태는 같은 날 두 이벤트를 할 수 없어, 이벤트 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;
}