zoukankan      html  css  js  c++  java
  • 洛谷P1278 单词游戏

    P1278 单词游戏

    题目描述

    Io和Ao在玩一个单词游戏。

    他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致。

    游戏可以从任何一个单词开始。

    任何单词禁止说两遍,游戏中只能使用给定词典中含有的单词。

    游戏的复杂度定义为游戏中所使用的单词长度总和。

    编写程序,求出使用一本给定的词典来玩这个游戏所能达到的游戏最大可能复杂度。

    输入输出格式

    输入格式:

    输入文件的第一行,表示一个自然数N(1≤N≤16),N表示一本字典中包含的单词数量以下的每一行包含字典中的一个单词,每一个单词是由字母A、E、I、O和U组成的一个字符串,每个单词的长度将小于等于100,所有的单词是不一样的。

    输出格式:

    输出文件仅有一行,表示该游戏的最大可能复杂度。

    输入输出样例

    输入样例#1:
    5
    IOO
    IUUO
    AI
    OIOOI
    AOOI
    输出样例#1:
    16
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,ans;
    struct node{
        int a,b,l;
    }q[20];
    bool vis[20];
    void dfs(int sum,int la){
        ans=max(ans,sum);
        for(int i=1;i<=n;i++){
            if(vis[i]||(q[i].a!=q[la].b&&la))continue;
            vis[i]=1;
            dfs(sum+q[i].l,i);
            vis[i]=0;
        }
    }
    int main(){
        //freopen("Cola.txt","r",stdin);
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            char ch[120];
            scanf("%s",ch+1);
            int len=strlen(ch+1);
            q[i].a=ch[1];
            q[i].b=ch[len];
            q[i].l=len;
        }
        dfs(0,0);
        printf("%d",ans);
    }
    70分 爆搜
    #include<iostream> 
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n,m,ans,dis[16],f[1<<16][16];
    char s[1<<16][110];
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s[i]);
            dis[i]=strlen(s[i])-1;
        }
        for(int i=1;i<=n;i++)
        f[(1<<(i-1))][i]=dis[i]+1;
        for(int i=0;i<=(1<<n)-1;i++)
        for(int j=1;j<=n;j++)
        {
            int e1=1<<(j-1);
            if((i|e1)==i)
            for(int k=1;k<=n;++k)
            {
                if((j==k)||(s[j][dis[j]]!=s[k][0]))
                continue;
                int e2=1<<(k-1);
                if((i&e2)==0)
                {
                    f[(i|e2)][k]=max(f[(i|e2)][k],f[i][j]+dis[k]+1);
                    ans=max(ans,f[(i|e2)][k]);
                }
            }
        }
        cout<<ans;
    }
    100分 状压dp
  • 相关阅读:
    hdu 1116 Play on Words
    hdu 1856 More is better
    跟随鼠标跑
    asp.net实现数据流文件下载
    在ASP.NET程序中集成更好的下载体验
    request.ContentType的可取值
    multipart formdata boundary 说明
    ASP.NET中实现多文件上传(普通)
    读取XML文件中的某个节点的某个属性
    获取请求的Headers部分
  • 原文地址:https://www.cnblogs.com/thmyl/p/7419793.html
Copyright © 2011-2022 走看看