社区讨论

站外题求助

题目总版参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo35oykf
此快照首次捕获于
2023/10/24 01:13
2 年前
此快照最后确认于
2023/10/24 01:13
2 年前
查看原帖
原题:
CPP
单词接龙是这样一个游戏:从一个单词开始,接下来后一个单词的第一个字母必须与前一个单词的最后一个字母一致。

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

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

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

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

输入格式
输入文件的第一行,表示一个自然数 n(1\le n\le 20)n(1≤n≤20),nn 表示一本字典中包含的单词数量。

以下的每一行包含字典中的一个单词,每一个单词是由字母'A''B''C''D''E'组成的一个字符串,每个单词的长度将小于等于 2020,所有的单词是不一样的。

输出格式
输出文件仅有一行,表示该游戏的最大可能复杂度。
我的代码:
CPP
#include<bits/stdc++.h>
#define N 30
using namespace std;
string s[N];
bool vis[N];
int len[N],n,dp[N],ans=0;
int dfs(int num,int sum){
    if(dp[num]!=-1) return dp[num];
    dp[num]=0;
    for(int i=1;i<=n;i++){
        if(!vis[i]&&s[num][s[num].size()-1]==s[i][0]){
            vis[i]=1;
            dp[num]=max(dp[num],dfs(i,sum+len[i]));
            vis[i]=0;
        }
    }
    dp[num]+=len[num];
    return dp[num];
}
int main(){
    freopen("word.in","r",stdin);
    freopen("word.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        cin>>s[i];
        len[i]=s[i].size();
    }
    memset(dp,-1,sizeof(dp));
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++){
        vis[i]=1;
        ans=max(ans,dfs(i,0));
        vis[i]=0;
    }
    printf("%d\n",ans);
}
请问各位大佬我的代码为啥不对呢

回复

0 条回复,欢迎继续交流。

正在加载回复...