zoukankan      html  css  js  c++  java
  • URAL 1501 Sense of Beauty

    URAL 1501

    思路:

    dp+记忆化搜索

    状态:dp[i][j]表示选取第一堆前i个和第二堆前j的状态:0:0多1个              1:0和1相等                2:1多一个         -2:不能达到题目所描述的状态

    初始状态:dp[0][0]=1

    状态转移:见代码

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define pb push_bck
    #define mem(a,b) memset(a,b,sizeof(a))
    
    const int N=1e3+5;
    int n1[N],n2[N];
    int dp[N][N];//0:0more 1:equal 2:1more
    int ans[N*2];
    int dfs(int x,int y){
        if(~dp[x][y])return dp[x][y];
        if(x==0&&y==0)return dp[x][y]=1;
        if(x!=0){
            int t=dfs(x-1,y);
            if(t==0){
                if(n1[x]==1){
                    ans[x+y]=1;
                    return dp[x][y]=1;
                }
            }
            else if(t==1){
                if(n1[x]==1){
                    ans[x+y]=1;
                    return dp[x][y]=2;
                }
                else if(n1[x]==0){
                    ans[x+y]=1;
                    return dp[x][y]=0;
                }
            }
            else if(t==2){
                if(n1[x]==0){
                    ans[x+y]=1;
                    return dp[x][y]=1;
                }
            }
        }
        if(y!=0){
            int t=dfs(x,y-1);
            if(t==0){
                if(n2[y]==1){
                    ans[x+y]=2;
                    return dp[x][y]=1;
                }
            }
            else if(t==1){
                if(n2[y]==1){
                    ans[x+y]=2;
                    return dp[x][y]=2;
                }
                else if(n2[y]==0){
                    ans[x+y]=2;
                    return dp[x][y]=0;
                }
            }
            else if(t==2){
                if(n2[y]==0){
                    ans[x+y]=2;
                    return dp[x][y]=1;
                }
            }
        }
        return dp[x][y]=-2;
    }
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n;
        string a[3];
        cin>>n;
        cin>>a[1]>>a[2];
        for(int i=1;i<=n;i++)n1[i]=a[1][i-1]-'0';
        for(int i=1;i<=n;i++)n2[i]=a[2][i-1]-'0';
        mem(dp,-1);
        if(dfs(n,n)!=-2){
            for(int i=1;i<=2*n;i++)cout<<ans[i];
            cout<<endl;
        }else cout<<"Impossible"<<endl;
        return 0;
    }
  • 相关阅读:
    TF-IDF
    智力题
    max{X,Y}和min{X,Y}的概率分布
    K-Means
    提高工作效率:给设计师的10条建议
    每个软件工程师都应该尝试的5件事
    CSS sprite 圆角——源代码
    比较大气的网页元素
    彩色网页变黑白色CSS代码变黑白色调!
    jquery适用技巧
  • 原文地址:https://www.cnblogs.com/widsom/p/8391352.html
Copyright © 2011-2022 走看看