zoukankan      html  css  js  c++  java
  • hihocoder 1334

    题目链接:https://hihocoder.com/problemset/problem/1334

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    Given N words from the top 100 common words in English (see below for reference), select as many words as possible as long as no two words share common letters.

    Assume that the top 100 common words in English are:

    the be to of and a in that have i it for not on with he as you do at this but his by from they we say her she or an will my one all would there their what so up out if about who get which go me when make can like time no just him know take people into year your good some could them see other than then now look only come its over think also back after use two how our work first well even new want because any these give day most us

    输入

    The first line contains an integer N, denoting the number of words. (1 ≤ N ≤ 40)  

    The second line contains N words from the top 100 common words.

    输出

    Output the most number of words can be selected.

    样例输入
    8
    the be to of and a in that 
    样例输出
    4

    题意:

    给出N个单词(1 ≤ N ≤ 40),在满足各个单词之间没有重复字母的情况下,求能选取最多多少个单词。

    题解:

    每个单词总共24个字母,用状态压缩之后,可以表示为小于2^24的整数;

    而且能很方便的表示当前哪些字母被占用了,哪些字母还没占用,选某个单词又会占用哪些字母;

    并且用过位运算能很方便地进行判断是否有重复字母;

    最后,直接DFS即可;

    AC代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define MAX 43
     5 using namespace std;
     6 int n,word[MAX];
     7 bool vis[MAX];
     8 int dfs(int now,int state)
     9 {
    10     int maxi=0;
    11     for(int nex=1;nex<=n;nex++)
    12     {
    13         if(vis[nex]) continue;
    14         if(state&word[nex]) continue;
    15         vis[nex]=1;
    16         maxi=max(maxi,dfs(nex,state|word[nex]));
    17         vis[nex]=0;
    18     }
    19     return now==0?maxi:maxi+1;
    20 }
    21 int main()
    22 {
    23     scanf("%d",&n);
    24     for(int i=1;i<=n;i++)
    25     {
    26         char str[10];
    27         scanf("%s",&str);
    28         word[i]=0;
    29         for(int j=0;str[j];j++) word[i]|=1<<(str[j]-'a');
    30     }
    31     memset(vis,0,sizeof(vis));
    32     int ans=dfs(0,0);
    33     printf("%d
    ",ans);
    34 }
  • 相关阅读:
    Oracle 查询语句截取字符串
    删除ORACLE数据库中重复的数据
    [易学C#]C#3.0语言新特性之匿名类型
    [讨论]程序之路在何方?
    [易学C#]C#3.0语言新特性之扩展方法
    [易学C#]C#3.0语言新特性之对象和集合初始化器
    用C#解决Oracle9i和Oracle10g字符集不兼容的问题
    一个C#操作Oracle的通用类
    [易学C#]C#3.0语言新特性之隐式类型
    重拾 DirectX 一:配置Visual Studio 2008+Microsoft DirectX SDK (June 2008) 开发环境
  • 原文地址:https://www.cnblogs.com/dilthey/p/7634237.html
Copyright © 2011-2022 走看看