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;
    }
  • 相关阅读:
    android_firewall or Droidwall http://code.google.com/p/droidwall/
    CMDProcessorLibrary
    Pimp_my_Z1
    HoloGraphLibrary
    程序猿正本清源式进化的意义
    UnsatisfiedLinkError: No implementation found for , AndroidStudio使用*.so
    HUNNU-10307-最优分解问题
    Spring声明式事务
    【献给CWNU的师弟】Web篇
    迪科斯彻算法总结
  • 原文地址:https://www.cnblogs.com/widsom/p/8391352.html
Copyright © 2011-2022 走看看