| ||||||||||
| 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,跑了8XXms。大家能帮忙看看哪里可以优化不?附AC代码Source Code
Problem: 1185 User: yzhw
Memory: 820K Time: 844MS
Language: GCC Result: Accepted
Source Code
# include <stdio.h>
# include <string.h>
char data[105][15];
int dp[2][59100];
int min(int a,int b)
{
return a<b?a:b;
}
int max(int a,int b)
{
return a>b?a:b;
}
void takenum(int num,int refer[],int bit)
{
int i;
for(i=1;i<=bit;i++)
{
refer[bit-i]=num%3;
num/=3;
}
}
int encode(int m,int temp[])
{
int total=0;
int i;
for(i=0;i<m;i++)
{
total=total*3+(temp[i]?temp[i]-1:0);
}
return total;
}
void search(int pos,int n,int m,int refer[],int oprice,int nprice)
{
if(pos>=m)
{
int code=encode(m,refer);
if(dp[n%2][code]<oprice+nprice)
dp[n%2][code]=oprice+nprice;
}
else if(data[n][pos]=='H'||refer[pos]!=0)
search(pos+1,n,m,refer,oprice,nprice);
else
{
int i;
search(pos+1,n,m,refer,oprice,nprice);
refer[pos]=3;
search(pos+3,n,m,refer,oprice,nprice+1);
refer[pos]=0;
}
}
int main()
{
int i,j,k,n,m,res=0;
scanf("%d %d",&n,&m);
memset(dp[0],0,sizeof(dp[0]));
for(i=1;i<=n;i++)
scanf("%s",data[i]);
for(i=1;i<=n;i++)
{
memset(dp[i%2],0,sizeof(dp[i%2]));
for(j=0;j<=59050;j++)
{
int status=j,price=dp[(i-1)%2][j];
int temp[10];
if(j!=0&&price==0) continue;
takenum(status,temp,m);
search(0,i,m,temp,price,0);
}
//printf("OK\n");
}
for(i=1;i<=59050;i++)
res=max(res,dp[n%2][i]);
printf("%d\n",res);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator