pku 1038 Bugs Integrated, Inc.(这题有点复杂)

写了好久,先是mle,后是tle,再是wa。这题还真是有点复杂。

空间卡得很紧,我是逐个位置搜索的,如果所有状态都保存的话铁定mle,于是状态我只能一行一行的保存,所以其中还是存在重复搜索的,不过因为M很小,所以也影响不大。还有,用int保存状态会mle,改成short就好了。

放置chips的时候由下往上放置,用3进制保存状态,每个位置的值的范围是0,1,2。0表示对下一行无影响,1表示占据了下一行的一个位置,2表示占据了下一行的2个位置。

#include <iostream> #define _clr(a,b) memset(a,b,sizeof(a)) template<class T> void get_max(T& a,T b) { if(a<b) a=b;} using namespace std; bool map[152][10]; short DP[152][60000],time3[10]; int N,M; const int MOVE=2; int OK0(int y,int last_state,int state)//第(x,y)位置不放置chips,根据前面一行的状态得到新状态 { last_state=last_state/time3[y]; state+=max(0,last_state%3-1)*time3[y]; return state; } int OK2(int x,int y,int last_state,int state)//以(x,y)为左下角放置一个2*3的chips。如果能够放置,返回放置后的新状态,否则返回0 { if(y+2>M||x-2<0) return 0; last_state/=time3[y]; for(int i=0;i<2;i++) { if(last_state%3||map[x+MOVE][y+i]||map[x-1+MOVE][y+i]||map[x-2+MOVE][y+i]) return 0; last_state/=3; state+=time3[y+i]*2; } return state; } int OK3(int x,int y,int last_state,int state)//以(x,y)为左下角放置一个3*2的chips。如果能够放置,返回放置后的新状态,否则返回0 { if(y+3>M||x-1<0) return 0; last_state/=time3[y]; for(int i=0;i<3;i++) { if(last_state%3||map[x+MOVE][y+i]||map[x-1+MOVE][y+i]) return 0; last_state/=3; state+=time3[y+i]; } return state; } int F(int x,int y,int last_state,int state) { if(x<0) return 0; if(y==0&&DP[x][last_state]>=0) return DP[x][last_state]; if(y==M) return F(x-1,0,state,0); int ans=0,temp=0,new_state; if(new_state=OK2(x,y,last_state,state)) temp=F(x,y+2,last_state,new_state)+1; get_max(ans,temp); if(new_state=OK3(x,y,last_state,state)) temp=F(x,y+3,last_state,new_state)+1; get_max(ans,temp); temp=F(x,y+1,last_state,new_state=OK0(y,last_state,state)); get_max(ans,temp); if(y==0) DP[x][last_state]=ans; return ans; } int main() { time3[0]=1; for(int i=1;i<10;i++) time3[i]=time3[i-1]*3; int T,ans; scanf("%d",&T); int point_cnt,x,y; for(int t=1;t<=T;t++) { scanf("%d%d%d",&N,&M,&point_cnt); _clr(DP,-1); _clr(map,0); for(int i=0;i<point_cnt;i++) { scanf("%d%d",&x,&y); map[x-1+MOVE][y-1]=true; } printf("%d/n",F(N-1,0,0,0)); } return 0; }

 

你可能感兴趣的:(pku 1038 Bugs Integrated, Inc.(这题有点复杂))