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 |
HELP! 为什么会超时呢 我觉得我的代码已经够短小了 :( 谁帮我看看还有什么优化的余地In Reply To:过了的同学能讲讲这题怎么优化吗? 我已经超了好多次时了…… Posted by:rruucc at 2003-08-22 19:02:44 #include<stdio.h> #include<math.h> #include<string.h> #define MaxN 100 #define MaxM 10 #define Total 81*81*9 #define MaxNum(a,b) (a>b?a:b) int bit[MaxM]={1,3,9,27,81,243,729,2187,6561,19683}; int n,m; char map[MaxN][MaxM+1]; int tol; int d2[MaxM],d[MaxM]; int min2[Total],min[Total]; int sit2[Total],sit1[Total]; int ns2,ns1; int ans,ok=0; void init() { int i,j; scanf("%d %d",&n,&m); tol=int(pow(3,m)); for (i=0,ans=0; i<n; i++) {scanf("%s",map[i]); for (j=0; j<m; j++) if (map[i][j]=='H') ok=0; if (i%3==0) ans+=4; else ans+=3; } memset(min2,-1,sizeof(min2)); memset(min,-1,sizeof(min)); min2[0]=0; ns2=1; sit2[0]=0; } void process(int s,int nc,int c,int base,int sit) { int i,tmp=0; if (min[sit]==-1) sit1[ns1++]=sit; min[sit]=MaxNum(min[sit],nc+base); for (i=s; i<m; i++) if (d2[i]==0&&map[c][i]=='P') {process(i+3,nc+1,c,base,sit+bit[i]*(2-d[i])); tmp++; if (tmp>2) break;//贪心 不过还是超时了 } } void search() { int i,k; int j,tj,tmp; for (i=0; i<n; i++) {ns1=0; for (j=0; j<ns2; j++) {for (k=0,tmp=0,tj=sit2[j]; k<m; k++) {d2[k]=tj%3; d[k]=MaxNum(d2[k]-1,0); tmp+=bit[k]*d[k]; tj/=3;} process(0,0,i,min2[sit2[j]],tmp); } memcpy(min2,min,sizeof(min)); memcpy(sit2,sit1,sizeof(sit1)); ns2=ns1; memset(min,-1,sizeof(min)); } } void show() { int i; for (i=0,ans=0; i<tol; i++) ans=MaxNum(ans,min2[i]); printf("%d\n",ans); } int main() {init(); if (m==10&&ok) printf("%d\n",ans); else {search(); show(); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator