zoukankan      html  css  js  c++  java
  • Code Forces 698A Vacations

    题目描述

    Vasya has nn days of vacations! So he decided to improve his IT skills and do sport. Vasya knows the following information about each of this nn days: whether that gym opened and whether a contest was carried out in the Internet on that day. For the ii -th day there are four options:

    1. on this day the gym is closed and the contest is not carried out;
    2. on this day the gym is closed and the contest is carried out;
    3. on this day the gym is open and the contest is not carried out;
    4. on this day the gym is open and the contest is carried out.

    On each of days Vasya can either have a rest or write the contest (if it is carried out on this day), or do sport (if the gym is open on this day).

    Find the minimum number of days on which Vasya will have a rest (it means, he will not do sport and write the contest at the same time). The only limitation that Vasya has — he does not want to do the same activity on two consecutive days: it means, he will not do sport on two consecutive days, and write the contest on two consecutive days.

    It is an easy DP but has a long DP funcation.

    0 means rest, 1 means contest and 2 means sport.

    Then the DP funcation come up quickly (i-1 means the last day):

    if(day[i]==0) dp[i][0]=min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]))+1;
    if(day[i]==1) 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(day[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(day[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]);

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #define in(a) a=read()
    #define REP(i,k,n)  for(int i=k;i<=n;i++) 
    using namespace std;
    inline int read(){
        int x=0,f=1;
        char ch=getchar();
        for(;!isdigit(ch);ch=getchar())
            if(ch=='-')
                f=-1;
        for(;isdigit(ch);ch=getchar())
            x=x*10+ch-'0';
        return x*f;
    }
    int n,m;
    int day[1010],dp[1010][3]; 
    int main(){
        in(n);
        memset(dp,127,sizeof(dp)); 
        REP(i,1,n)  in(day[i]);
        dp[0][0]=dp[0][1]=dp[0][2]=0; 
        REP(i,1,n){
            if(day[i]==0)  dp[i][0]=min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]))+1;
            if(day[i]==1)  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(day[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(day[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]);
            //cout<<dp[i][0]<<" "<<dp[i][1]<<" "<<dp[i][2]<<endl; 
        }
        cout<<min(dp[n][0],min(dp[n][1],dp[n][2])); 
        return 0;
    } 
  • 相关阅读:
    OpenCV-2.4.6-android-sdk 人脸识别demo搭建
    Vmware 8.00 文件共享ubuntu
    C#_ 项目打包附加数据库
    show()与showDialog()的区别
    列不属于表--可能出现的问题总结
    每个开发人员现在应该下载的十种必备工具
    C#生成XML的三种途径
    为什么DropDownList的SelectedIndexChanged事件触发不了
    SQL Server 2017搭建主从备份
    .NET Core 微服务架构-Docker部署
  • 原文地址:https://www.cnblogs.com/jason2003/p/10321434.html
Copyright © 2011-2022 走看看