您的位置:首页 > 其它

URAL1501. Sense of Beauty(记忆化)

2013-09-20 11:58 288 查看
链接

dfs+记忆化 对于当前状态虽然满足和差 但如果搜下去没有满足的情况也是不可以的 所以需要记忆化下

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;
char s1[1010],s2[1010];
int dp[1010][1010];
int sum1,sum2;
int p[2010],n,flag;
int ss1[1010],ss2[1010];
int st1[1010],st2[1010];
int dfs(int x,int y,int v,int o)
{
if(flag)
return 1;
if(dp[x][y]==2)
return 2;
if(o==1)
p[v] = 1;
else
p[v] = 2;
int i;
if(v==2*n)
{
for(i = 1; i <= 2*n ; i++)
printf("%d",p[i]);
puts("");
flag = 1;
return 1;
}
if(y<n&&abs((ss1[x]+ss2[y+1])-(st1[x]+st2[y+1]))<=1)
{

if(dfs(x,y+1,v+1,2)==1)
return dp[x][y+1] = 1;
else
dp[x][y+1] = 2;
}
if(x<n&&abs((ss1[x+1]+ss2[y])-(st1[x+1]+st2[y]))<=1)
{
if(dfs(x+1,y,v+1,1)==1)
return dp[x+1][y] = 1;
else
dp[x+1][y] = 2;
}
}
int main()
{
int i,j,k;
scanf("%d",&n);
scanf("%s%s",s1,s2);
ss1[0]=0,ss2[0]=0;st1[0] = 0;st2[0]=0;
for(i = 0 ; i < n ; i++)
if(s1[i]=='1')
{
ss1[i+1] = ss1[i]+1;
st1[i+1] = st1[i];
}
else
{
st1[i+1] = st1[i]+1;
ss1[i+1] = ss1[i];
}
for(i =0  ; i < n ; i++)
if(s2[i]=='1')
{
ss2[i+1] = ss2[i]+1;
st2[i+1] = st2[i];
}
else
{
st2[i+1] = st2[i]+1;
ss2[i+1] = ss2[i];
}
dfs(1,0,1,1);
if(!flag)
dfs(0,1,1,2);
if(!flag)
printf("Impossible\n");
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: