数位DP总结

数位DP总结

1、hdu2089 不要62(模板)

dp步骤:https://www.cnblogs.com/wenruo/p/4725005.html

#include <iostream>
#include <cstdio>
#include <cstring>
 
using namespace std;
 
int dp[10][10];
int d[10];
 
void init()
{
    dp[0][0] = 1;
    for (int i = 1; i <= 7; ++i)
        for (int j = 0; j <= 9; ++j)
            for (int k = 0; k <= 9; ++k)
                if (j != 4 && !(j == 6 && k == 2))
                    dp[i][j] += dp[i - 1][k];
}
 
int solve(int n)
{
    int ans = 0;
    int len = 0;
    while (n) {
        ++len;
        d[len] = n % 10;
        n /= 10;
    }
    d[len + 1] = 0;
    for (int i = len; i >= 1; --i) {
        for (int j = 0; j < d[i]; ++j) {
            if (d[i + 1] != 6 || j != 2)
                ans += dp[i][j];
        }
        if (d[i] == 4 || (d[i + 1] == 6 && d[i] == 2))
            break;
    }
    return ans;
}
 
int main()
{
    int m, n;
    init();
    while (scanf("%d%d", &m, &n) == 2) {
        if (n == 0 && m == 0) break;
        printf("%d\n", solve(n + 1) - solve(m));
    }
    return 0;
}

2、HDU3555 要49(套不要62板子)

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

long long dp[20][20];
long long d[10];

void init()
{
    dp[0][0] = 1;
    for (int i = 1; i <= 19; ++i)
        for (int j = 0; j <= 9; ++j)
            for (int k = 0; k <= 9; ++k)
                if (!(j == 4 && k == 9))
                    dp[i][j] += dp[i - 1][k];
}

long long solve(long long n)
{
    long long ans = 0;
    int len = 0;
    while (n) {
        ++len;
        d[len] = n % 10;
        n /= 10;
    }
    d[len + 1] = 0;
    for (int i = len; i >= 1; --i) {
        for (int j = 0; j < d[i]; ++j) {
            if (d[i + 1] != 4 || j != 9)
                ans += dp[i][j];
        }
        if ((d[i + 1] == 4 && d[i] == 9))
            break;
    }
    return ans;
}

int main()
{
    long long m,n;
    int t;
    init();

    cin>>t;
    while(t--)
    {
        m=1;
        cin>>n;
        printf("%lld\n",n- solve(n + 1) + solve(m));
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HC595是一款集成电路芯片,常用于驱动数字显示器如数码管。它采用了串行输入并行输出的工作方式,能够通过控制引脚来实现对8位数码管的控制。 HC595的工作原理如下:首先,将要显示的数字按照位顺序(百位、十位、个位等)依次输入到HC595的串行数据输入(DS)端。然后,通过时钟(SHCP)引脚给HC595提供时钟信号,使得输入的数据顺序移入移位寄存器中。 在时钟信号的作用下,移位寄存器将串行输入的数据逐步向左边移动,并将其输出到移位寄存器的Q7'S引脚,即实现了对移位寄存器中数据的并行输出。 然后,通过锁存(STCP)引脚给HC595提供锁存信号,将并行输出的数据锁存到输出寄存器中。输出寄存器的8位数据依次对应着数码管的8个段(例如A、B、C等)。最后,通过控制显示器的控制引脚,选择性地将输出寄存器中的数据输出到数码管的相应段进行显示。 总结来说,HC595驱动8位数码管的原理是通过串行输入并行输出的方式,将要显示的数据输入到移位寄存器中,然后将并行输出的数据锁存到输出寄存器中,最后将数据输出到数码管进行显示。通过控制引脚的信号,可以实现对8位数码管的控制。 ### 回答2: HC595是一种串行输入并行输出的移位寄存器芯片。我们可以使用HC595来驱动8位数码管。这种驱动方式被称为级联式驱动。 首先,将单片机的串行输出口(MCU)接到HC595芯片的串行输入(DS)引脚上。然后,将HC595芯片的时钟输入(SHCP)与MCU的时钟输出口连接。并将HC595的输出锁存时钟(STCP)引脚连接到MCU的引脚上。 接下来,将数码管的可变输出引脚(A~G,DP)连接到HC595的8个输出引脚(Q0~Q7)。此外,还需要将数码管的共阳/共阴极与电源引脚相连。 工作原理如下:首先,MCU将需要显示的数字通过串行输入(DS)传送给HC595芯片。然后,MCU向HC595芯片发送一个时钟脉冲,HC595芯片会将串行输入的数据移位到其内部的寄存器中。 当MCU发送完所有的数据后,继续发送一个锁存时钟脉冲给HC595芯片(STCP),这时HC595芯片将内部寄存器中的数据传送到输出引脚(Q0~Q7)上。每个输出引脚将控制数码管的不同段(A~G)的亮灭状态,从而显示相应的数字。 通过不断发送数据并锁存脉冲,MCU可以循环刷新显示不同的数字,实现数码管的动态显示效果。 这种级联式驱动方式可以实现多位数码管的驱动,只需将多个HC595芯片按照上述方式连接,将第一个HC595的时钟输出连接到第二个HC595的串行输入,依此类推。这样,我们只需要使用MCU的几个引脚就可以同时驱动多个数码管,大大节省了MCU的资源。 ### 回答3: HC595是一种串行输入并行输出的移位寄存器,能够灵活地驱动8位数码管。其工作原理如下: 首先,将外部提供的数据通过串行输入引脚(SER)输入到第一个HC595寄存器的串行输入端,然后通过时钟输入引脚(SRCLK)输入一个上升沿触发数据到移位寄存器内部。这时,移位寄存器将输入数据存储在第一个寄存器中,并将其余的数据向右进行移位。 接下来,将第一个HC595寄存器的输出引脚(QH')通过串行输出引脚(SRCLK)连接到第二个HC595寄存器的串行输入引脚(SER),再次通过时钟输入引脚触发,将第一个寄存器中的数据移位到第二个寄存器。 如此重复,将数据依次移位到第三、第四、...、第八个寄存器中。最后,所有的数据都存储在相应的寄存器中。 最后一步,通过锁存时钟引脚(RCLK)的上升沿,将寄存器中的数据锁存到输出引脚(QH', QG',...,QL')上。这些输出引脚通过适当的限流电阻连接到数码管的控制引脚上,实现对数码管的驱动。 总结来说,HC595通过串行输入数据,并通过移位的方式将这些数据存储在多个寄存器中,最终将数据锁存到输出引脚上,实现对数码管的驱动。通过控制输入时钟和锁存时钟引脚的触发时机,可以控制数据的移位和存储过程,从而实现不同的数码管显示效果。这种方式简化了对大量数码管的驱动电路设计,提高了系统的可扩展性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值