题目描述
众所周知,牛牛不喜欢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;
}