恩,感觉自己dp的感觉又提升了一点 ,不过做完还是觉得没有完完全全明白。。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX1=510,MAX2=110;
int s[MAX1][6],dp[MAX1][MAX2],father[MAX1][MAX2],dir[MAX1][MAX2];
char direction[6][10]={"front", "back", "left", "right", "top" , "bottom"};
void print(int n,int index)
{
if(father[n][index]==0)
return ;
print(n-1,father[n][index]);
if(dp[n-1][father[n][index]]+1==dp[n][index])
{
printf("%d %s\n",n,direction[dir[n][index]]);
}
}
int main()
{
int n,i,j,t,maxx,cases=0,index;
while(scanf("%d",&n)&&n)
{
for(i=1;i<=n;i++)
for(j=0;j<6;j++)
scanf("%d",&s[i][j]);
memset(dp,0,MAX1*MAX2*4);
memset(father,0,MAX1*MAX2*4);
memset(dir,0,MAX1*MAX2*4);
maxx=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=MAX2;j++)
{
dp[i][j]=dp[i-1][j];
father[i][j]=j;
}
for(j=1;j<=MAX2;j++)
{
for(t=0;t<6;t++)
{
if(s[i][t]==j)
{
if(dp[i][s[i][t%2==0?t+1:t-1]]<dp[i-1][j]+1)
{
dp[i][s[i][t%2==0?t+1:t-1]]=dp[i-1][j]+1;
father[i][s[i][t%2==0?t+1:t-1]]=j;
dir[i][s[i][t%2==0?t+1:t-1]]=t;
}
//dp[i][s[i][t%2==0?t+1:t-1]]=max(dp[i-1][j]+1,dp[i][s[i][t%2==0?t+1:t-1]]);
}
}
}
}
for(j=1;j<=MAX2;j++)
{
if(dp[n][j]>maxx)
{
maxx=dp[n][j];
index=j;
}
}
if(cases)
printf("\n");
printf("Case #%d\n%d\n",++cases,maxx);
print(n,index);
}
return 0;
}