P1481 魔族密码

题目链接:

P1481 魔族密码 - 洛谷

思路:

典型的dp题目

首先,如何判断两个单词组成词链?

首先后面的一定要比前边的长

其次就是要满足前缀这个条件(并不是子字符串)

这里用compare函数:

compare 是"比较两段字符串",返回三个值之一:

复制代码
0     相等
< 0   左边小
> 0   左边大

它有三种用法,这个题用到的是第二种。

三个参数的形式

复制代码
a.compare(pos, len, b)

读作:

把 a 从 pos 开始、取 len 个字符,跟 b 比。


dp思路:

dpi是前i个单词组成的最长词链;

转移:就是对于第i个单词,检索其前面所有的单词,若满足条件,就把这个单词接到后面,也就是+1;最后综合比较哪种情况最大;

同时题目数据顺序不一定是有序的,需要再进行排序,以确认dp方向:

代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,ans = 1;
    cin >> n;
    vector<string> arr(n);
    vector<int> dp(n,1);
    for(int i = 0;i < n;i++) cin >> arr[i];
    sort(arr.begin(),arr.end());
    for(int i = 0;i < n;i++)
        for(int j = 0;j < i;j++)
        {
            if(arr[i].size() > arr[j].size() && arr[i].compare(0,arr[j].size(),arr[j]) == 0)
            {
                dp[i] = max(dp[i],dp[j] + 1);
                ans = max(ans,dp[i]);
            }
        }
    cout << ans;
    return 0;
}
相关推荐
加宝的起点雷达4 小时前
40 条候选里 38 条来自同一个源,主卡整屏重样
人工智能·算法·创业
秋天的怀念_David4 小时前
算法一千零一夜 · 第二十六夜 协议的母语
java·spring boot·算法
闻缺陷则喜何志丹6 小时前
【C++特性】四种类型转
c++·算法·类型转换
喵本喵叁肆6 小时前
用 Boosting 把弱隐私算法炼成强隐私算法(英文原题:Boosting and Differential Privacy (FOCS 2010))
算法·集成学习·boosting
青梅味猪大肠7 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
apcipot_rain10 小时前
C++转Java日记(02)
java·开发语言·c++
杜 硕10 小时前
从零开始的C++生活——第七讲——02
开发语言·c++·生活