http://codeforces.com/contest/812/problem/B
#include<iostream> #include<algorithm> #include <memory.h> #include<string> using namespace std; int dp[15][2]; int p[15][2]; int main(){ int s; int num[102]; int n,m; cin>>n>>m; memset(num,0,m+2); memset(dp,0,n*2); m=m+2; for(int i=0;i<n;i++){ string s; cin>>s; for(int j=0;j<m;j++){ num[j]=s[j]-'0'; } int count=0; for(int j=0;j<m;j++){ if(num[j]==1){ count=j+1; break; } } p[i][0]=max(count,1); for(int j=m-1;j>=0;j--){ if(num[j]==1){ count=j+1; break; } } p[i][1]=max(count,1); } int t=0; for(int i=0;i<n;i++){ if(p[i][0]==1 && p[i][1]==1) t++; else break; } if(t==n) cout<<0; else{ p[n-1][0]=p[n-1][1]; dp[n-1][0]=max(p[n-1][1]-1,0); dp[n-1][1]=max(p[n-1][1]-1,0); for(int i=n-1;i>t;i--){ if(p[i-1][0]!=1 && p[i-1][1]!=1){ //第i层有灯开 dp[i-1][0]=min(dp[i][1]+p[i][0]-1+p[i-1][1]-1+1,dp[i][0]+p[i][1]-1+p[i-1][1]-1+1); //i 向左走 dp[i-1][1]=min(dp[i][1]+m-p[i][0]+m-p[i-1][0]+1,dp[i][0]+m-p[i][1]+m-p[i-1][0]+1); //i 向右走 }else{ dp[i-1][0]=dp[i][0]+1; dp[i-1][1]=dp[i][1]+1; p[i-1][0]=p[i][0]; p[i-1][1]=p[i][1]; } } cout<<min(dp[t][0],dp[t][1])<<endl;; } return 0; } /* 3 2 0000 0100 0100 */
思路简单的dp,但是有些小细节没注意到,调试我好长时间,很蛋疼。