天天看點

Sagheer, the Hausmeister CodeForces - 812B

​​Sagheer, the Hausmeister CodeForces - 812B ​​

題意:n層大樓,每層m個房間左右兩邊有一個樓梯。給出n*(m+2)的矩陣,1表示有燈0表示無燈。問人從左下角出發,關掉樓裡所有燈的最短時間。每上一層樓需要1機關時間,同層每移動一格需要1機關時間。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int inf=0x7f7f7f7f;
int n,m;
char map[20][110];
int dp[20][2],pd[20][2];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    scanf("%s",map[i]);
    memset(dp,0,sizeof(dp));
    int top=n-1;
    for(int i=n-1;i>=0;i--)
    {
        int flag=0;
        for(int j=m+1;j>=0;j--)
        {
            if(map[i][j]=='1')
            {top=i;flag=j;break;}//dp[i][j]=max()}
        }
        dp[i][0]=flag;
        flag=m+1;
        for(int j=0;j<m+2;j++)
        {
            if(map[i][j]=='1')
                {flag=j;break;}
        }
        dp[i][1]=m+1-flag;//l,r的值找到
    }

    pd[n-1][0]=0;pd[n-1][1]=m+1;
    for(int i=n-2;i>=top;i--)
    {
        pd[i][0]=min(pd[i+1][0]+dp[i+1][0]*2+1,pd[i+1][1]+m+1+1);
        pd[i][1]=min(pd[i+1][0]+m+1+1,pd[i+1][1]+dp[i+1][1]*2+1);
    }
    
    if(top==n-1)
        printf("%d\n",dp[top][0]);
    else
    {
        printf("%d\n",min(pd[top][0]+dp[top][0],pd[top][1]+dp[top][1]));
    }
    return 0;
}