//两列火车入站,重新排列的车厢符不符合要求
//记忆化搜索,ans[i][j]记录的是第一列火车的第i节和第二列火车的第j列在组合后的序列里找不找的到
//如果找的到就标记为1,因为是从前到后搜索,所以在ans[n][m]=1时,表示符合
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define N 1005
bool ans[N][N];
int str1[N],str2[N],str3[N*2];
int n,m,t;
void solve(int n1,int n2)
{
if(n1>n||n2>m) return ;
if(n1==n&&n2==m)
{
ans[n1][n2]=1; return ;
}
if(ans[n1][n2]) return ;
ans[n1][n2]=1;
if(str3[n1+n2+1]==str1[n1+1]&&!ans[n][n])
solve(n1+1,n2);
if(str3[n1+n2+1]==str2[n2+1]&&!ans[n][n])
solve(n1,n2+1);
}
int main()
{
int i,j,k;
while(scanf("%d%d",&n,&m),n&&m)
{
for(i=1;i<=n;i++) scanf("%d",&str1[i]);
for(i=1;i<=m;i++) scanf("%d",&str2[i]);
for(i=1;i<=n+m;i++) scanf("%d",&str3[i]);
memset(ans,0,sizeof(ans));
solve(0,0);
if(ans[n][m]) puts("possible");
else puts("not possible");
}
return 0;
}
hdu3779---记忆化搜索
最新推荐文章于 2020-02-24 15:07:38 发布