Round Numbers[数位DP][二进制]

博客介绍了如何利用数位动态规划(DP)和二进制方法来解决确定一个给定区间内,二进制表示中0不少于1的数字个数的问题。由于区间范围较大,因此采用DP和记忆化搜索,通过记录dp[pos][num0][num1]状态来表示当前位pos、0的数量num0和1的数量num1下的答案。在搜索过程中,要特别注意首位1的位置,因为首位1未确定时,前置0不计入统计。

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

题意:确定一个给定区间内二进制0不少于1的数字的个数。 区间范围较大。
首先确定用数位DP,不再是十进制DP,采用二进制数DP。记忆化搜索记录状态dp[pos][num0][num1]表示当前位pos位,之前有num0个二进制0,有num1个二进制1的状态下的答案。
在搜索过程中,注意首位1的位置,如果首位1没有确定,那么前置0是不能计入统计的。

//#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
typedef long long LL;
LL dp[50][50][50];
int bit[
# -*- coding: utf-8 -*- from machine import Pin import onewire import ds18x20 import time # ====== 硬件配置 ====== ‌:ml-citation{ref="1,3" data="citationList"} # 5641AS数码管引脚定义(共阴型) # 位选引脚(控制哪一位显示) DIGITS = [Pin(5, Pin.OUT), # 第1位 Pin(18, Pin.OUT), # 第2位 Pin(19, Pin.OUT), # 第3位 Pin(21, Pin.OUT)] # 第4位 # 段选引脚(控制显示数字形状) SEGMENTS = [Pin(13, Pin.OUT), # a段 Pin(12, Pin.OUT), # b段 Pin(14, Pin.OUT), # c段 Pin(27, Pin.OUT), # d段 Pin(26, Pin.OUT), # e段 Pin(25, Pin.OUT), # f段 Pin(33, Pin.OUT), # g段 Pin(32, Pin.OUT)] # 小数点dp # 数字编码(共阴型,0表示点亮) NUMBERS = { 0: [0,0,0,0,0,0,1,1], # 0 1: [1,0,0,1,1,1,1,1], # 1 2: [0,0,1,0,0,1,0,1], # 2 3: [0,0,0,0,1,1,0,1], # 3 4: [1,0,0,1,1,0,0,1], # 4 5: [0,1,0,0,1,0,0,1], # 5 6: [0,1,0,0,0,0,0,1], # 6 7: [0,0,0,1,1,1,1,1], # 7 8: [0,0,0,0,0,0,0,1], # 8 9: [0,0,0,0,1,0,0,1], # 9 '-': [1,1,1,1,1,1,0,1], # 负号 'E': [0,1,1,0,0,0,0,1] # 错误标识 } # ====== DS18B20初始化 ====== ‌:ml-citation{ref="3" data="citationList"} ds_pin = Pin(15) # 温度传感器接GPIO15(示例引脚,可修改) ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin)) roms = ds_sensor.scan() # ====== 温度读取函数 ====== ‌:ml-citation{ref="3,4" data="citationList"} def read_temp(): try: ds_sensor.convert_temp() time.sleep_ms(750) # 等待温度转换 temp = ds_sensor.read_temp(roms) return round(temp, 1) except: return None # 传感器异常返回空值 # ====== 数码管显示函数 ====== ‌:ml-citation{ref="1,2" data="citationList"} def display_number(number, decimal_pos=-1): # 异常显示处理 if number is None: segments = NUMBERS['E'] + NUMBERS['E'][:-1] for i in range(4): DIGITS[i].value(0 if i==0 else 1) # 仅第一位显示E for seg, val in zip(SEGMENTS, segments): seg.value(val) time.sleep_ms(5) return # 数字分解处理 str_num = f"{abs(number):4.1f}".replace(' ','').zfill(4)
最新发布
03-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值