| ||||||||||
| 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