要么去体育馆,要么去比赛,要么闲在家里
给出每一天体育馆和比赛的有无情况,要求连续两天不能去同一个地方
问最少闲几天
DP方程很容易看出
dp(第i天能去的地方) = min(dp(第i-1天的三种情况)) ;
dp(第i天呆在家里) = min(dp(第i-1天的三种情况))+1;
1 #include2 #include 3 using namespace std; 4 #define inf 0x3f3f3f3f 5 int a[105],ans[105][3],n; 6 void dfs() 7 { 8 ans[0][0]=ans[0][1]=ans[0][2]=0; 9 for(int i=1;i<=n;i++)10 {11 if(a[i]==0)12 {13 ans[i][1]=inf;14 ans[i][2]=inf;15 }16 else if(a[i]==1)17 {18 ans[i][1]=inf;19 ans[i][2]=min(ans[i-1][0],ans[i-1][1]); 20 }21 else if(a[i]==2)22 {23 ans[i][2]=inf;24 ans[i][0]++;25 ans[i][1]=min(ans[i-1][0],ans[i-1][2]); 26 }27 else28 {29 ans[i][2]=min(ans[i-1][0],ans[i-1][1]);30 ans[i][1]=min(ans[i-1][0],ans[i-1][2]); 31 }32 ans[i][0]=min(ans[i-1][0],ans[i-1][1]);33 ans[i][0]=min(ans[i][0],ans[i-1][2]);34 ans[i][0]++;35 }36 }37 int main()38 {39 scanf("%d",&n);40 for(int i=1;i<=n;i++)41 {42 scanf("%d",&a[i]); 43 }44 dfs();45 int res=min(ans[n][0],ans[n][1]);46 res=min(res,ans[n][2]);47 printf("%d\n",res);48 }