动态规划—— CodeForces - 812B
2017-08-07 01:03
411 查看
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.
Example
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.
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.
Example
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.
比较麻烦,dp[楼层][上的方向],进行枚举就好了。关键是模拟~
#include<iostream> #include<string> #include<vector> #include<algorithm> #include<queue> #include<cstdio> #include<cstring> #include<cmath> #include<map> using namespace std; typedef long long ll; const int INF_INT = 0x3f3f3f3f; const ll INF_LL = 1e18; const int MAXN =1e5+5; const int MAXM = 1015; int n,m; int l[20]; int r[20]; int mm[20][105]; int dp[20][2]; string s; int main() { // ios_base::sync_with_stdio(false); // freopen("data.txt","r",stdin); memset(dp,0,sizeof(dp)); cin >> n>>m; m+=2; for(int i=0;i<n;i++) { cin >>s; for(int j=0;j<m;j++) { if(s[j]=='0') { mm[n-1-i][j]=0; } else { mm[n-1-i][j]=1; } } } for(int i=0;i<n;i++) { int j; for(j=0;j<m-1;j++) { if(mm[i][j]) { l[i] = j; break; } } if(j==m-1) l[i]=m-1; l[i] = m-1-l[i]; // cout<<i<<" ||"<<l[i]<<endl; } for(int i=0;i<n;i++) { int j; for(j=m-1;j>0;j--) { if(mm[i][j]) { r[i] = j; break; } } if(j==0) r[i] = 0; // cout<<i<<" |r"<<r[i]<<endl; } int tmp_n=n-1; while(r[tmp_n]==0) { tmp_n--; if(tmp_n<0) { cout<<0<<endl; return 0; } } dp[0][0] = (r[0]); if(l[0]==0) { dp[0][1] = m-1; } else { dp[0][1] = (r[0]+l[0]-(m-1-r[0])); } for(int i=1;i<=tmp_n;i++) { dp[i][0] = min(dp[i-1][0]+1+r[i-1],dp[i-1][1]+1+m-1-l[i-1])+r[i]; dp[i][1] = min(dp[i-1][0]+1+m-1-r[i-1],dp[i-1][1]+1+l[i-1])+l[i]; } // for(int i=0;i<=tmp_n;i++) // { // cout<<dp[i][0]<<" "<<dp[i][1]<<endl; // } cout<<min(dp[tmp_n][0],dp[tmp_n][1])<<endl; }
相关文章推荐
- 【动态规划】【数位DP】[Codeforces 55 D]Beautiful numbers
- Codeforces 866C Gotta Go Fast - 动态规划 - 概率与期望 - 二分答案
- Codeforces 834D The Bakery - 动态规划 - 线段树
- Codeforces 506E Mr. Kitayuta's Gift - 动态规划 - 矩阵
- 动态规划,而已! CodeForces 433B - Kuriyama Mirai's Stones
- Codeforces 812B-Sagheer, the Hausmeister
- 【Codeforces 949D】Shake It! 【动态规划】
- Codeforces 2B. The least round way(动态规划)
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem D (Codeforces 831D) - 贪心 - 二分答案 - 动态规划
- 【动态规划】Codeforces 711C Coloring Trees
- Codeforces 750E New Year and Old Subsequence - 线段树 - 动态规划
- Codeforces 448D(动态规划、类H数)
- Codeforces 812B-Sagheer, the Hausmeister
- 【打CF,学算法——三星级】Codeforces 698A Vacations (动态规划)
- CodeForces 148E(动态规划)
- 【codeforces 808E】【Selling Souvenirs】【贪心】【动态规划】
- codeforces 484D Kindergarten 【动态规划】
- Codeforces 762D Maximum path 动态规划
- 【动态规划】Codeforces 711C Coloring Trees
- Working out 【codeforces-429B】【动态规划】