http://poj.org/problem?id=1038
这题我找Wrong找到想吐了。。。。本来就是看别人的代码,别人的思路写的,感觉都一模一样了,但还是Wrong。我就从别人正确的代码,一个函数一个函数的换成我的函数,wocao,怎么全部搬过来都还是AC了。。。。。。最上面怎么会有问题???难道头文件会Wrong???
哇~这要是真的的话,那我就发现了什么不得了的事了(〃’▽’〃)
结果。。。我TM的数组开小了。。。。。哎~一下午的时间(;´д`)ゞ
#include"iostream"
#include"cstring"
#include"cmath"
using namespace std;
const int maxn=59050;
int dp[2][maxn];
int ternary[maxn][11];
int Map[151][11];
int p[11],q[11];
int N,M,K;
int all,pre,now;
int ans;
int ten(int *p)//ÓÐÖÖhashµÄ¸Ðjio
{
int res=0;
for(int i=1; i<=M; i++)res=res*3+p[i];
return res;
}
void three()
{
for(int i=0; i<all; i++)
{
int t=i;
for(int j=0; j<M; j++)
{
ternary[i][M-j]=t%3;
t/=3;
}
}
}
void print()
{
for(int i=0; i<all; i++)
{
for(int j=1; j<=M; j++)cout<<ternary[i][j]<<" ";
int t=ten(ternary[i]);
cout<<"t="<<t<<"\n";
cout<<"\n";
}
}
void dfs(int k,int nownum,int qnum)
{
dp[now][qnum]=max(dp[now][qnum],nownum);
ans=max(ans,nownum);
for(int i=k; i<=M; i++)
{
if(i+1<=M)
{
if(q[i]==0&&q[i+1]==0&&p[i]==0&&p[i+1]==0)//Êú×Å·Å
{
q[i]=q[i+1]=2;
dfs(i+2,nownum+1,ten(q));
q[i]=q[i+1]=0;
}
}
if(i+2<=M)
{
if(p[i]<=1&&p[i+1]<=1&&p[i+2]<=1&&q[i]==0&&q[i+1]==0&&q[i+2]==0)//ºá×Å·Å
{
q[i]=q[i+1]=q[i+2]=2;
dfs(i+3,nownum+1,ten(q));
q[i]=q[i+1]=q[i+2]=0;
}
}
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
ans=0;
cin>>N>>M>>K;
all=pow(3,M);
three();
memset(Map,0,sizeof(Map));
for(int i=1; i<=K; i++)
{
int x,y;
cin>>x>>y;
Map[x][y]=1;
}
pre=now=1;
for(int i=1; i<=M; i++)
{
p[i]=Map[1][i]+1;//¾ÍÊÇ˵µÚÒ»ÐÐÉÏÃæûÓУ¬ËùÒÔµ±³ÉÓж«Î÷µ²×Å£¬ËùÒÔÖÁÉÙ¶¼ÊÇ1
}
memset(dp,-1,sizeof(dp));
dp[pre][ten(p)]=0;
for(int i=1; i<N; i++)
{
now=pre^1;
memset(dp[now],-1,sizeof(dp[now]));
for(int sta=0; sta<all; sta++)
{
if(dp[pre][sta]==-1)continue;
for(int k=1; k<=M; k++)p[k]=ternary[sta][k];
for(int k=1; k<=M; k++)
{
if(Map[i+1][k]==1)q[k]=2;
else if(p[k]==0)q[k]=0;
else q[k]=p[k]-1;
}
dfs(1,dp[pre][sta],ten(q));
}
pre=now;
}
cout<<ans<<"\n";
}
}