| ||||||||||
| 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 | |||||||||
2Y,HAPPYIn Reply To:求三进制代码 Posted by:hanzikai at 2010-11-24 22:27:39 #include<stdio.h>
#include<string.h>
bool f[152][11];
short dp[152][59050];
int n,m,b[11],res,A[11],B[11];
int max(int x,int y)
{
return x>y?x:y;
}
int hash(int a[])
{
int i,res=0;
for(i=0;i<m;i++)
res+=a[i]*b[i];
return res;
}
void _hash(int a[],int zt)
{
int i;
for(i=0;i<m;i++,zt/=3)
a[i]=zt%3;
}
void lzs(int l,int x,int zt,int c)
{
if(x==m)
{
if(dp[l][zt]<c)
dp[l][zt]=c;
return ;
}
if(x<m-1&&!B[x]&&!B[x+1]&&!A[x]&&!A[x+1])
lzs(l,x+2,zt+2*b[x]+2*b[x+1],c+1);
if(x<m-2&&!B[x]&&!B[x+1]&&!B[x+2])
lzs(l,x+3,zt+2*b[x]+2*b[x+1]+2*b[x+2],c+1);
lzs(l,x+1,zt,c);
}
int main()
{
int t,k,x,y,i,j,l,st,ed;
b[0]=1;
for(i=1;i<11;i++)
b[i]=b[i-1]*3;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
memset(f,true,sizeof(f));
while(k--)
{
scanf("%d%d",&x,&y);
f[x][y-1]=false;
}
memset(dp,-1,sizeof(dp));
for(i=0;i<m;i++)
{
if(!f[1][i])
A[i]=2;
else
A[i]=1;
}
st=hash(A);
dp[1][st]=0;
for(i=2;i<=n;i++)
{
for(j=0;j<b[m];j++)
{
if(dp[i-1][j]==-1)
continue;
_hash(A,j);
for(l=0;l<m;l++)
{
if(!f[i][l])
B[l]=2;
else if(A[l]<2)
B[l]=0;
else
B[l]=1;
}
ed=hash(B);
lzs(i,0,ed,dp[i-1][j]);
}
}
int res=0;
for(i=0;i<b[m];i++)
if(res<dp[n][i])
res=dp[n][i];
printf("%d\n",res);
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator