Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
我用状态压缩DP做的,JAVA跑了2900多MS,汗~~Source Code Problem: 1085 User: yzhw Memory: 4176K Time: 2938MS Language: Java Result: Accepted Source Code import java.io.*; import java.util.Arrays; public class Main { static int refer[][]=new int[11][11]; static int dic[]=new int[18]; static int look[]=new int[1<<18]; static int maketri(int id,int code) { int num=0; switch(id) { case 0: if((code|dic[1])==code&&(code|dic[2])==code) num++; break; case 1: if((code|dic[0])==code&&(code|dic[2])==code) num++; break; case 2: if((code|dic[1])==code&&(code|dic[0])==code) num++; if((code|dic[4])==code&&(code|dic[5])==code) num++; break; case 3: if((code|dic[4])==code&&(code|dic[7])==code) num++; break; case 4: if((code|dic[3])==code&&(code|dic[7])==code) num++; if((code|dic[2])==code&&(code|dic[5])==code) num++; break; case 5: if((code|dic[2])==code&&(code|dic[4])==code) num++; if((code|dic[6])==code&&(code|dic[8])==code) num++; break; case 6: if((code|dic[5])==code&&(code|dic[8])==code) num++; break; case 7: if((code|dic[3])==code&&(code|dic[4])==code) num++; if((code|dic[10])==code&&(code|dic[11])==code) num++; break; case 8: if((code|dic[5])==code&&(code|dic[6])==code) num++; if((code|dic[12])==code&&(code|dic[13])==code) num++; break; case 9: if((code|dic[10])==code&&(code|dic[15])==code) num++; break; case 10: if((code|dic[9])==code&&(code|dic[15])==code) num++; if((code|dic[11])==code&&(code|dic[7])==code) num++; break; case 11: if((code|dic[7])==code&&(code|dic[10])==code) num++; if((code|dic[12])==code&&(code|dic[16])==code) num++; break; case 12: if((code|dic[11])==code&&(code|dic[16])==code) num++; if((code|dic[8])==code&&(code|dic[13])==code) num++; break; case 13: if((code|dic[8])==code&&(code|dic[12])==code) num++; if((code|dic[14])==code&&(code|dic[17])==code) num++; break; case 14: if((code|dic[13])==code&&(code|dic[17])==code) num++; break; case 15: if((code|dic[10])==code&&(code|dic[9])==code) num++; break; case 16: if((code|dic[11])==code&&(code|dic[12])==code) num++; break; case 17: if((code|dic[13])==code&&(code|dic[14])==code) num++; break; }; return num; } static int dp(int code) { if(code==262143) return 0; else if(look[code]!=-1) return look[code]; else { int maxnum=-999999; for(int i=0;i<18;i++) if((code|dic[i])!=code) { int tcode=(code|dic[i]); int res=maketri(i,tcode); if(res>0) res=res+dp(tcode); else res=-dp(tcode); maxnum=Math.max(maxnum, res); } look[code]=maxnum; return maxnum; } } public static void main(String[] args) throws IOException{ StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); in.nextToken(); int gamenum=(int)in.nval; //start initation refer[1][2]=0; refer[1][3]=1; refer[2][3]=2; refer[2][4]=3; refer[2][5]=4; refer[3][5]=5; refer[3][6]=6; refer[4][5]=7; refer[5][6]=8; refer[4][7]=9; refer[4][8]=10; refer[5][8]=11; refer[5][9]=12; refer[6][9]=13; refer[6][10]=14; refer[7][8]=15; refer[8][9]=16; refer[9][10]=17; for(int i=0;i<18;i++) dic[i]=(1<<i); //end for(int i=1;i<=gamenum;i++) { int code=0,turn=0,c[]=new int[2]; c[0]=c[1]=0; Arrays.fill(look, -1); in.nextToken(); int s=(int)in.nval; for(int j=1;j<=s;j++) { int t1,t2; in.nextToken(); t1=(int)in.nval; in.nextToken(); t2=(int)in.nval; code=(code|dic[refer[t1][t2]]); int res=maketri(refer[t1][t2],code); if(res!=0) c[turn]+=res; else turn=(turn+1)%2; } c[turn]+=dp(code); System.out.print("Game "+i+": "); if(c[0]>c[1]) System.out.print("A wins. "); else System.out.print("B wins. "); System.out.println(); } } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator