P1278 单词游戏 - DFS

P1278 单词游戏

传送门

Sol:

枚举词典中的每个单词,然后跑DFS。再加个记忆化就不会T了。

AC Code:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 16 + 4,M = 100 + 10;
int n;
char S[N][M];
int len[N];
int f[N][1<<N];
int dfs(int x,int ud){
    if(f[x][ud]) return f[x][ud];
    for(int i=0;i<n;i++){
        if((ud>>i)&1) continue;
        if(S[x][len[x]]!=S[i][1]) continue;
        f[x][ud]=max(f[x][ud],dfs(i,ud|(1<<i))+len[i]);
    }
    return f[x][ud];
}
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s",S[i]+1);len[i]=strlen(S[i]+1);
    }
    int ans=-(1<<30);
    for(int i=0;i<n;i++){
        ans=max(ans,dfs(i,(1<<i))+len[i]);
    }
    printf("%d",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/Loi-Brilliant/p/9744614.html

时间: 2024-11-09 05:08:31

P1278 单词游戏 - DFS的相关文章

P1278 单词游戏

状态压缩,用二进制来保存状态 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 string words[17]; 5 int rem[17][70000];//末尾是第i个单词的时候,用了集合是j的元素 6 int ans; 7 int dfs(int now,int book) 8 { 9 if(rem[now][book]!=-1)return rem[now][book]; 10 rem[now][book]=0;

模拟猜单词游戏

模拟实现猜单词游戏,纯模拟,不涉及图形界面,注释很详细,虽然本人代码写得丑,但是希望可以给大家提供帮助 #include<algorithm> #include<cstdlib> #include<cstring> #include<fstream> #include<ctime> #include<cmath> #include<iomanip> #include<windows.h> using names

DOM练习小记--简单的拼单词游戏

(资料源自<Head First Ajax>第七章) 书中另一个单页游戏案例,综合了DOM和事件处理,先总结一下页面布局和js编程的思路.涉及到服务端交互的暂时按下,毕竟还没有自己把服务端环境搭起来. 1) 内容简介 书中给的样本页面和样式是布置好的,初始静态页面如下: 4row*4col布局,每次初始化都会随机出现16个字母图片: 点击任意字母会把对应字母输入到旁边字母框中,每次提交前每个字母只能点击一次: 需要拼出一个合法的单词,OK后点击submit提交(Ajax): 如果合法则在分数框

POJCurling 2.0(冰壶游戏)(DFS)

Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12490   Accepted: 5265 Description On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is

HDU 2209 翻纸牌游戏(DFS)

题目链接 Problem Description 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者有反翻到正)时,他左右两张纸牌(最左边和最右边的纸牌,只会影响附近一张)也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,使得每张纸牌都正面朝上,如果可以,最少需要多少次操作. Input 有多个case,每个case输入一行01符号串(长度不超过2

cdoj 1252 24点游戏 dfs

24点游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1252 Description 24点就是给你一串数字,问你是否通过加减乘除括号构成24点. 沈爷觉得这个很好玩,就决定考考你,给你4个数,可以交换位置,可以用加减乘除和括号,是否能构成24点呢? 注意哦~这里的除法并不是整数除法,比如样例 Input 第一行T,表示有多少组测试数据,1≤T≤50 接下来T行,每行4

HDOj-2209-翻纸牌游戏-DFS

翻纸牌游戏 Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2622    Accepted Submission(s): 943 Problem Description 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一

hdu1427 24点游戏 (DFS)ps:AC了最开心的一道题

速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3755    Accepted Submission(s): 923 Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','

POJ 3009 Curling 2.0冰壶游戏(dfs)

条件:要移动的方向旁边有障碍物时不能动 来自 http://blog.sina.com.cn/s/blog_7865b08301013fku.html 的代码,感叹下自己代码的渣渣 1 int map[MAX][MAX] ; 2 int h, w , min = INT_MAX ; 3 int sx , sy , ex, ey ; 4 int d[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; 5 void init(){ 6 for(int i = 0 ;i < h