吉比特编程题第二题(2018数)代码

记忆化搜索:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
typedef long long ll;
int dp[12][5];
int digit[12];
const int a2018[4] = {2, 0, 1, 8};
int dfs(int pos, int i, bool limit) {
    if(pos==-1) {
        return i == 4;
    }
    if(!limit && dp[pos][i]!=-1) {
        return dp[pos][i];
    }
    int ans = 0;
    int up = limit? digit[pos] : 9;
    for(int j = 0; j <= up; ++ j) {
        if(j == a2018[i]) {
            ans += dfs(pos-1, i+1, limit&(j==up));
        }
        else {
            ans += dfs(pos-1, i, limit&j==up);
        }
    }
    if(!limit) {
        dp[pos][i] = ans;
    }
    return ans;
}
int f(int n) {
    int len = -1;
    while(n) {
        digit[++len] = n%10;
        n /= 10;
    }
    return dfs(len, 0, true);
}
int main() {
    int n;
    while(~scanf("%d", &n)) {
        memset(dp, -1, sizeof(dp));
        printf("%d\n", f(n));
    }
    return 0;
}

update:这题是数位dp问题,上面的代码用的时记忆化搜索,思路就是把小于等于n的数都搜一遍,但是有很多结果是重复的,所以加个数组把每次计算出的结果都保存下来,比如要找小于55555555的“2018”数,那么以13开头的13xxxxxx和以14开头的14xxxxxx的“2018”数的个数是一样的;大家可以网上找找数位dp的入门帖子学学。

#吉比特#
全部评论
import java.util.Scanner; /**  * Created by jia on 2018/9/3.  */ public class Main {     public static void main(String[] args) {             Scanner sc = new Scanner(System.in);             String x   = sc.nextLine();             int num = Integer.valueOf(x);             int count = 0;            if (num < 1000000000){                 while(num >999){                     char [] arr = String.valueOf(num).toCharArray();                     StringBuilder str = new StringBuilder();                     for(int i = 0; i < arr.length;i++ ){                         if(arr[i] == '2'){                             str.append("2");                         }                         if(arr[i] == '0'){                             str.append("0");                         }                         if(arr[i] == '1'){                             str.append("1") ;                         }                         if(arr[i] =='8' ){                             str.append("8");                         }                     }                     if (str.toString().equals("2018")){                         count++;                     }                     num --;                 }             }         System.out.print(count);     } }
点赞 回复 分享
发布于 2018-09-10 00:23
大佬啊,很强
点赞 回复 分享
发布于 2018-09-03 20:58
有题目么
点赞 回复 分享
发布于 2018-09-03 21:01
大佬!
点赞 回复 分享
发布于 2018-09-03 21:02
大佬,可以提供个思路吗?直接代码不懂啊
点赞 回复 分享
发布于 2018-09-03 21:05
大佬强
点赞 回复 分享
发布于 2018-09-03 21:06
大佬能稍微解释一下吗,看不懂啊
点赞 回复 分享
发布于 2018-09-03 21:08
小于等于 是怎么做到的
点赞 回复 分享
发布于 2018-09-03 21:17
题目来了
点赞 回复 分享
发布于 2018-09-03 21:42
大佬,选择题160个箱子,轮流取1-5,a第一个取多少可以保证一定可以取到160,这道题怎么解,谢谢大佬
点赞 回复 分享
发布于 2018-09-04 08:13
 public static void method_1_1(int n){   int []stack={2, 0, 1, 8};   int index=0;   //统计2018数的个数   int count=0;   //遍历   for(int i=2018; i<=n; i++){    String s=i+"";    //遍历这个数    for(int j=0; j<s.length(); j++){     if((s.charAt(j)-'0')==stack[index]){      index++;      //如果找到了2018数      if(index==4){       count++;       break;      }     }    }    index=0;   }   System.out.println(count);    }
点赞 回复 分享
发布于 2018-09-05 16:35
我这种菜鸡做法对不,测试数据是多少
点赞 回复 分享
发布于 2018-09-10 00:25
结果不对啊根本
点赞 回复 分享
发布于 2019-04-10 21:26

相关推荐

01-23 14:54
同济大学 Java
热爱敲代码的程序媛:给你提几点【专业技能】这个模块里面可优化的地方:1.【具备JVM调优经验】可以去b站上搜一下JVM调优的视频,估计一两个小时凭你的学习能力就能掌握JVM调优的实践方面的技能。2.【MySql优化】MySql这一栏,你去b站或者找个博客看看MySql优化,学一下,如果你本身比较熟悉MySql语句的话,那基本半天时间凭你的学习能力MySql语句优化方面的技能你也能掌握个差不多。以上1,2两点主要是因为我看你专业技能大部分都说的是偏理论,没有写应用。再就是最后,你结合你的项目,想一想你的项目中哪些sql语句是可以用MySql优化的,到时候你面试的时候也好结合着说一下。
点赞 评论 收藏
分享
头像
02-15 16:23
中南大学 Java
野猪不是猪🐗:签了美团真是不一样! 亲戚们都知道我签了美团,过年都围着我问送一单多少钱,还让弟弟妹妹们引以为戒,笑我爸我妈养了个🐢孩子,说从小就知道我这个人以后肯定没出息,我被骂的都快上天了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务