第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

藍橋杯 2023 省B 洛谷P9242題 解題思路和步驟

標簽:
C++

https://img1.sycdn.imooc.com/47793068084655fb09850723.jpg




一、问题理解与建模分析

本题要求处理接龙数列的最长长度问题,核心在于识别数字序列的首位连接规律。根据题目描述,当某数字末位与后续数字首位相同时,可形成有效连接。我们需要建立数学模型:将每个数字抽象为具有首尾两个属性的节点,问题即转化为寻找最长符合条件的节点连接路径。

如何快速获取每个数字的首位数字?这涉及字符串处理技巧。对于输入数字n,可以通过转换为字符串后取首字符和末字符。数字123的首位分别是'1'和'3'。这个预处理步骤的时间复杂度直接影响整体算法效率,建议在O(1)时间内完成。

二、关键代码实现步骤

代码实现分为三个主要模块:输入处理、DP状态转移、结果输出。使用快速IO优化输入输出,避免超时问题。对于每个输入数字,同步记录其首位数字和末位数字。核心代码如下:

string s = to_string(num);
char head = s[0], tail = s.back();

动态规划转移方程的实现需要特别注意状态继承关系。每次处理新数字时,其可能贡献的链长是之前同首位的最大链长+1,同时需要维护当前末位数字对应的最大值。这种双重维护机制确保了时间复杂度控制在O(n)级别。


三、代码注释

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    // 优化输入输出,提高处理速度
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n;  // 输入数字的个数
    cin >> n;
    
    // dp数组:dp[i]表示以数字i(0-9)结尾的最长接龙序列长度
    vector<int> dp(10, 0);
    
    for (int i = 0; i < n; ++i) {
        string num;  // 当前数字的字符串表示
        cin >> num;
        
        // 获取数字的首位和末位数字
        int head = num[0] - '0';  // 首位数字
        int tail = num.back() - '0';  // 末位数字
        
        // 状态转移:当前数字可以接在相同head的数字后面
        // 更新以tail结尾的最长接龙序列长度
        dp[tail] = max(dp[tail], dp[head] + 1);
    }
    
    // 找出所有可能结尾中的最大值,即最长接龙序列长度
    int max_len = *max_element(dp.begin(), dp.end());
    
    // 输出需要删除的数字个数 = 总个数 - 最长接龙序列长度
    cout << n - max_len;
    
    return 0;
}


原文:蓝桥杯 2023 省B 洛谷P9242题 解题思路和步骤 C++实现带注释

點擊查看更多內(nèi)容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優(yōu)惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消