蓝桥杯 算法训练 K好数(DP C++)

本文介绍了一种使用动态规划方法来计算特定条件下两位四进制数中K好数的数量。通过定义DP数组来记录不同位数及结尾数字为特定值时K好数的个数,并给出了详细的实现步骤及代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题干要求

【思路分析】
题目的意思是,求2位四进制数(只有0 1 2 3这四个数字)中,K好数的个数是多少。

状态:定义DP数组,DP[i][j]表示共i位数且结尾数字是j的K好数的个数。
当i=1时,也就是数字位数是1时,所有的数字都是K好数,因为没有数字相邻的情况。但是因为开头数字是j,所以要注意第一个数字不能是0,所以赋值时从1开始,最大为k-1。

状态转移方程:dp[i][j]=(dp[i][j]+dp[i-1][q])。
其实就是从第一个数字开始,逐个找出后面的数字不能与前一个数字相邻的情况有多少种,直到i=l为止。
最后,将长度为l的以0,1,2……k-1结尾的K好数的个数加起来。


【题解代码】

#include<stdio.h>
#include<string.h>

int dp[105][105];
int main(){
    int k,l;
    while(scanf("%d%d",&k,&l)!=EOF){ // 循环语句内等价于~scanf() 
        memset(dp,0,sizeof(dp)); // 可有可无 
        /*void *memset(void *s, int ch, size_t n);
        函数解释:将s中当前位置后面的n个字节用ch替换并返回s。
        memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法*/

        for(int i=1;i<k;i++)//当数字位数为1时,从1开始,个数都是1,K好数就是i 
            dp[1][i]=1;
        for(int i=2; i<=l; i++){ // i控制位数 
            for(int j=0;j<k;j++){ // j是前一位,数字的取值范围是0~k-1 
                for(int q=0;q<k;q++){ // q是后一位,数字的取值范围是0~k-1 
                    if(j-q==1 || j-q==-1) continue;
                    dp[i][j]=(dp[i][j]+dp[i-1][q])%1000000007;
                }
            } 
        }    
        long long ans=0;
        for(int i=0;i<k;i++)
            ans+=dp[l][i];  // 位数为l的方案数加和 
        printf("%d\n",ans%1000000007);
    }
    return 0;
}
### 关于蓝桥杯竞赛的算法总结和学习资料 #### 蓝桥杯常见考点概述 蓝桥杯作为一项面向全国大学生的重要编程赛事,其考察范围广泛涵盖了多种基础算法以及实际应用能力。根据已有的参考资料[^1],蓝桥杯的核心知识点被整理成了一张思维导图,其中包含了诸如搜索、排序、动态规划等经典算法。 #### 常见算法分类及其应用场景 以下是蓝桥杯中常见的几类算法及其具体的应用场景: - **搜索算法** 搜索是蓝桥杯中的重要部分之一,分为广度优先搜索(BFS)和深度优先搜索(DFS)。这些方法通常用于解决路径寻找、状态转移等问题。 - **排序算法** 排序不仅是基本技能,也是许多复杂问题的基础。快速排序、归并排序等高效排序方式经常出现在题目背景之中[^3]。 - **动态规划 (DP)** 动态规划适用于求解最优化问题,例如背包问题、最长公共子序列等。这类问题的特点是可以分解为若干相互重叠的小规模子问题[^4]。 - **贪心策略** 对某些特定条件下的全局最优解可以通过局部最优来实现,比如区间覆盖或者活动安排等问题都适合采用此思路处理。 - **其他高级主题** - 图论:涉及连通性判断、最小生成树构建等内容; - 论:质因分解、同余方程组求解等方面的知识点也时常出现; - 字符串匹配与模式识别技术同样不可忽视; #### Python 和 C++ 的语言支持情况对比分析 虽然官方推荐使用 C/C++ 参加比赛因为执行效率较高,但是近年来也有越来越多选手选择 python 来完成答题工作。Python 版本下对于很多标准库函的支持更加友好便捷,能够有效减少编码时间成本。 下面给出一段简单的 BFS 实现代码供参考: ```python from collections import deque def bfs(graph, start_node): visited = set() queue = deque([start_node]) while queue: node = queue.popleft() if node not in visited: print(node) # Process the current node here. visited.add(node) for neighbor in graph[node]: if neighbor not in visited: queue.append(neighbor) # Example usage of BFS function with an adjacency list representation of a graph. example_graph = { 'A': ['B', 'C'], 'B': ['D', 'E'], 'C': ['F'], 'D': [], 'E': ['F'], 'F': [] } bfs(example_graph, 'A') ``` #### 提升准备建议 针对即将到来的比赛周期短但强度高的特点制定合理计划尤为重要。可以从以下几个方面入手加强训练效果: - 定期刷历年真题保持手感熟悉命题风格; - 集中攻克个人薄弱环节专项突破; - 多参与线上评测平台模拟实战积累经验. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值