1732: 就不喜欢66

题目描述

众所周知,牛牛不喜欢6这个数字(因为牛牛和66发音相近)。
所以他想知道,不超过n位十进制数中有多少个数字不含有连续的6(从1开始算的)。

输入

输入只包含一个正整数n(1<=n<20)。

输出

满足条件的数字个数。

样例输入 Copy

1
2​

样例输出 Copy

10
99

提示

个位数中,1,2,3,4,5,6,7,8,9,10 这十个数字中都满足条件。十位数中66不满足条件。

因为数据范围 n<20,所以简单的遍历是不可行的了,要找到其中的规律。

用DP,dp[ i ] [ j ] 表示 i 位时,个位数字为 j 时满足条件的数目。

用了三层循环:
第一层遍历数字 n 位数,
第二层计算 i 位&&个位数为 j 的数目
第三层的k代表十位上的数字。

判断十位和个位数不同时为0,dp[i][j]得加上dp[i-1][k]
代码: if(j!=6||k!=6) dp[i][j]=dp[i][j]+dp[i-1][k];

代码:

#include<bits/stdc++.h>

using namespace std;
const int N=30;
int n;
long long dp[N][N];

int main(){
    while(cin>>n){
        memset(dp,0,sizeof dp);
        for(int i=1;i<=9;i++){
            dp[1][i]=1;
        }

        for(int i=2;i<=n;i++){
            for(int j=0;j<=9;j++){
                for(int k=0;k<=9;k++){
                    if(j!=6||k!=6) dp[i][j]=dp[i][j]+dp[i-1][k];
                }
            }
        }
        long long num=1;
        for(int i=1;i<=n;i++){
            for(int j=0;j<=9;j++){
                num+=dp[i][j];
            }
        }
        cout<<num<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值