Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

恶心死我了,把代码贴出来以示惩罚

Posted by fanhqme at 2008-11-22 17:45:56 on Problem 1038
#include <cstdio>
#include <string.h>
using namespace std;
short dp[150][59049],map[150][10];
int N,M,times3[15];
inline int D3(int zt,int y){return (zt%times3[y+1])/times3[y];}
int Ok2(int zt,int x,int y){
    if (y+2>M)return 0;
    if (map[x][y] || map[x][y+1])return 0;
    if (D3(zt,y)<2 || D3(zt,y+1)<2)return 0;
    return 1;
}
int Ok3(int zt,int x,int y){
    if (y+3>M)return 0;
    if (map[x][y] || map[x][y+1] || map[x][y+2])return 0;
    if (D3(zt,y)<1 || D3(zt,y+1)<1 || D3(zt,y+2)<1)return 0;
    return 1;
}
inline int New2zt(int nzt,int y){return nzt | (1<<y) | (1<<(y+1));}
inline int New3zt(int nzt,int y){return nzt | (1<<y) | (1<<(y+1)) | (1<<(y+2));}
int Newzt(int x,int zt,int nzt){int r;r=0;
    for (int i=M-1;i>=0;i--){r*=3;
        if (((nzt & (1<<i))==0) && map[x][i]==0){
           if (D3(zt,i)>=1)r+=2;
           else r+=1;
        }
    }
    return r;
}
int f(int x,int y,int zt,int nzt,int now){
    if (x<0)return 0;
    if (y==0 && dp[x][zt]>=0)return dp[x][zt];
    if (y>=M)return now+f(x-1,0,Newzt(x,zt,nzt),0,0);
    if (y==0)dp[x][zt]=0;
    int tmp,res;
    res=0;
    if (Ok2(zt,x,y)){
       tmp=f(x,y+2,zt,New2zt(nzt,y),now+1);
       if (res<tmp)res=tmp;
    }
    if (Ok3(zt,x,y)){
       tmp=f(x,y+3,zt,New3zt(nzt,y),now+1);
       if (res<tmp)res=tmp;
    }
    tmp=f(x,y+1,zt,nzt,now);
    if (res<tmp)res=tmp;
    if (y==0)dp[x][zt]=res;
    return res;
}
int main()
{
    int T,K,x,y;
    times3[0]=1;
    for (int i=1;i<15;i++)times3[i]=3*times3[i-1];
    scanf("%d",&T);
    while (T--){
          memset(dp,0xff,sizeof(dp));
          memset(map,0,sizeof(map));
          scanf("%d %d %d",&N,&M,&K);
          for (int i=0;i<K;i++){
              scanf("%d %d",&x,&y);
              map[x-1][y-1]=1;
          }
          printf("%d\n",f(N-1,0,0,0,0));
    }
    return 0;
}


Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator