Codeforces Round #325 (Div. 2) Phillip and Trains dp
原题连接:http://codeforces.com/contest/586/problem/D
题意:
就大家都玩过地铁奔跑这个游戏(我没玩过),然后给你个当前的地铁的状况,让你判断人是否能够出去。
题解:
就首先预处理一下每个点在哪些时刻会被车子占领,然后从右向左dp一下就好
代码:
#include<iostream> #include<cstring> #include<string> #include<vector> #include<algorithm> #include<cmath> #define MAX_N 123 using namespace std; int n,k; string ma[3]; bool d[3][MAX_N][MAX_N]; int T; bool dp[3][MAX_N]; void print(){ for(int i=0;i<3;i++,cout<<endl) for(int j=0;j<n;j++)cout<<dp[i][j]<<" "; cout<<"----"<<endl; } int main(){ cin.sync_with_stdio(false); cin>>T; while(T--){ cin>>n>>k; memset(dp,0,sizeof(dp)); memset(d,0,sizeof(d)); for(int i=0;i<3;i++)cin>>ma[i]; for(int i=0;i<3;i++) for(int j=0;j<n;j++) if(ma[i][j]<='Z'&&ma[i][j]>='A') for(int k=j,t=0;k>=0;k-=2,t++) d[i][k][t]=1; for(int i=0;i<3;i++) dp[i][0]=('s'==ma[i][0]); for(int j=0;j<n-1;j++){ for(int i=0;i<3;i++){ if(dp[i][j]){ if(d[i][j+1][j])continue; for(int k=0;k<3;k++) if(d[k][j+1][j]==0&&d[k][j+1][j+1]==0&&abs(k-i)<=1) dp[k][j+1]=1; } } //print(); } bool ans=0; for(int i=0;i<3;i++)ans|=dp[i][n-1]; if(ans)cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }