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;
}