1 条题解

  • 0
    @ 2026-4-7 15:39:52

    对于这种接龙型问题,具体只关心两个数字的首位和末位,与具体数值大小无关,而获取的值就是接龙序列的最长长度,只需知道首位和上一末位相同则长度加一即可。

    因此定义状态数组为dp[i]=x,表示以i结尾的接龙序列最长长度为x

    #include<bits/stdc++.h>
    using namespace std;
    
    #define ll long long
    int N;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        cin >> N;
        vector<int> dp(10, 0);   //dp[i]:以i结尾的最长整数数列长度
        int x;
        for (int i = 1; i <= N; i++)
        {
            cin >> x;
    
            int first = x;
            while (first >= 10)first /= 10;//获取首位的数字
            int last = x % 10;    //获取末尾的数字
    
            //状态转移,当前数字可以接在以首位结尾的数字后面,也就是dp[first],长度加一
            //或者不接在后面,自己作为一个长度
            dp[last] = max(dp[first] + 1, dp[last]);
        }
    
        //最终结果是统计出最长的长度,接着用总长度减去最长的长度就是需要删除的长度
        int maxlen = 0;
        for (int i = 0; i < 10; i++)maxlen = max(dp[i], maxlen);
        cout << N - maxlen << endl;
    
    
    
        return 0;
    }
    
    • 1

    信息

    ID
    549
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    27
    已通过
    18
    上传者