zoukankan      html  css  js  c++  java
  • F. Spy-string(状压DP)

    (说实话开始我也没想到这是状压.....)

    (但是写完后发现这确实是正解)

    (发现每一个字符串只能有一次不匹配的机会)

    (那么我们就状压所有字符串(最多10位)的匹配状态)

    (0表示目前都符合,1表示目前有1个不符合)

    (然后每次枚举第i位要放置的字符,看看是否能从之前的状态转移过来)

    (至于记录答案,用一个pre数组记录前驱,具体看代码吧)

    (如果哪里表诉不清晰,可以评论区见)

    #include <bits/stdc++.h>
    using namespace std;
    #define p(a,b) make_pair(a,b)
    int t,n,m,dp[19][1050][27];
    char s[19][19];
    typedef pair<int,int>p;
    p pre[19][1050][27];
    void dfs(int m,int q,int j)
    {
    	if(m==1)
    	{
    		cout<<char(j+'a');
    		return;
    	}
    	p now=pre[m][q][j];
    	dfs(m-1,now.first,now.second);
    	cout<<char(j+'a');
    }
    int main()
    {
    	cin>>t;
    	while(t--)
    	{
    		memset(dp,0,sizeof(dp));
    		memset(pre,0,sizeof(pre));
    		cin>>n>>m;
    		for(int i=1;i<=n;i++)	cin>>(s[i]+1);
    		for(int i=0;i<=25;i++)	dp[0][0][i]=1;
    		for(int i=1;i<=m;i++)
    		{
    			for(int j=0;j<=25;j++)
    			{
    				char w=j+'a';
    				int now=0;
    				for(int q=1;q<=n;q++)
    					if(w!=s[q][i])	now+=(1<<(q-1));
    				for(int e=0;e<=25;e++)
    				for(int q=0;q<1024;q++)
    				{
    					if(q&now)	continue;
    					if(dp[i-1][q][e])
    					{
    						dp[i][q|now][j]=1;
    						pre[i][q|now][j]=p(q,e);
    					}
    				}
    			}
    		}
    		int flag=0;
    		for(int q=0;q<1024;q++)
    		{
    			for(int j=0;j<=25;j++)
    			if(dp[m][q][j])
    			{
    				flag=1;
    				dfs(m,q,j);
    				break;
    			}
    			if(flag)	break;
    		}
    		if(flag==0)	cout<<-1;
    		cout<<endl;
    	}
    }
    
  • 相关阅读:
    css3.0新属性效果在ie下的解决方案(兼容性)
    ajax实现md5加密
    ajax给全局变量赋值问题
    前端资源分享
    7件你不知道但可以用CSS做的事
    jQuery 常用效果
    ThinkPHP redirect 传参
    join和split 的使用
    JSON_FORCE_OBJECT 数字索引数组 强转对象
    layer 弹框不显示内容
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12963244.html
Copyright © 2011-2022 走看看