您的位置:首页 > 其它

Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister —— DP

2017-06-14 10:41 477 查看
题目链接:http://codeforces.com/problemset/problem/812/B

B. Sagheer, the Hausmeister

time limit per test
1 second

memory limit per test
256 megabytes

input
standard input

output
standard output

Some people leave the lights at their workplaces on when they leave that is a waste of resources. As a hausmeister of DHBW, Sagheer waits till all students and professors leave the university building, then goes and turns all the lights off.

The building consists of n floors with stairs at the left and the right sides. Each floor has m rooms
on the same line with a corridor that connects the left and right stairs passing by all the rooms. In other words, the building can be represented as a rectangle with n rows
and m + 2 columns, where the first and the last columns represent the stairs, and the m columns
in the middle represent rooms.

Sagheer is standing at the ground floor at the left stairs. He wants to turn all the lights off in such a way that he will not go upstairs until all lights in the floor he is standing at are off. Of course, Sagheer must visit a room to turn the light there
off. It takes one minute for Sagheer to go to the next floor using stairs or to move from the current room/stairs to a neighboring room/stairs on the same floor. It takes no time for him to switch the light off in the room he is currently standing in. Help
Sagheer find the minimum total time to turn off all the lights.

Note that Sagheer does not have to go back to his starting position, and he does not have to visit rooms where the light is already switched off.

Input

The first line contains two integers n and m (1 ≤ n ≤ 15 and 1 ≤ m ≤ 100)
— the number of floors and the number of rooms in each floor, respectively.

The next n lines contains the building description. Each line contains a binary string of length m + 2 representing
a floor (the left stairs, then m rooms, then the right stairs) where 0 indicates
that the light is off and 1 indicates that the light is on. The floors are listed from top to bottom, so that the last line represents the
ground floor.

The first and last characters of each string represent the left and the right stairs, respectively, so they are always 0.

Output

Print a single integer — the minimum total time needed to turn off all the lights.

Examples

input
2 2
0010
0100


output
5


input
3 4
001000
000010
000010


output
12


input
4 3
01110
01110
01110
01110


output
18


Note

In the first example, Sagheer will go to room 1 in the ground floor, then he will go to room 2 in
the second floor using the left or right stairs.

In the second example, he will go to the fourth room in the ground floor, use right stairs, go to the fourth room in the second floor, use right stairs again, then go to the second room in the last floor.

In the third example, he will walk through the whole corridor alternating between the left and right stairs at each floor.

题解:

1.l[i]记录在第i层中,从左往右数,最后一个“1”的位置; r[i]记录在第i层中,从右往左数,最后一个“1”的位置。

2.对于第i层楼的左梯,它可能是从下一层的左梯转移过来的,也可能是从下一层楼的右梯转移过来。对于右梯也一样。

所以:dp[i][j] 表示当到达第i层的j梯(0为左梯,1为右梯)时,所花费的最少步数。

状态转移方程:

{
de10
dp[i][0] = min(dp[i-1][0]+2*l[i]+1, dp[i-1][1]+m+2);
dp[i][1] = min(dp[i-1][1]+2*r[i]+1, dp[i-1][0]+m+2);
}


代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const double eps = 1e-6;
const int INF = 2e9;
const LL LNF = 9e18;
const int mod = 1e9+7;
const int maxn = 15+10;

int n, m, h;
int l[maxn], r[maxn], dp[maxn][2];

void init()
{
scanf("%d%d",&n,&m);
char s[150];
for(int i = n; i>=1; i--)
{
scanf("%s",s);
for(int j = 1; j<=strlen(s)-2; j++)
{
if(s[j]=='1')
{
if(!h) h = i;
if(!r[i]) r[i] = m+1-j;
l[i] = j;
}
}
}
}

void solve()
{
dp[0][0] = 0;
dp[0][1] = INF/2;
for(int i = 1; i<h; i++)
{
dp[i][0] = min(dp[i-1][0]+2*l[i]+1, dp[i-1][1]+m+2);
dp[i][1] = min(dp[i-1][1]+2*r[i]+1, dp[i-1][0]+m+2);
}
int ans = min(dp[h-1][0]+l[h], dp[h-1][1]+r[h]);
cout<<ans<<endl;
}

int main()
{
init();
solve();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: