9.13 美团软开题目

这一次题目总体不难,1、2、5AC,第三题a了45%,第四题偷了18%,下面发发第三题给大家看看,我用回溯做的,暴力超时了,希望有大佬发发代码
填数游戏
时间限制: 3000MS
内存限制: 589824KB
题目描述:
小团和小美正在玩一个填数游戏,这个游戏是给一个等式,其中有一些数被挖掉了,你需要向其中填数字,使得等式成立。
比如 ___+12=34,那么横线填的一定是22
现在,这个游戏到了最后一关,这一关的等式很奇特:_+_+_+...+_=n
这里可以填任意多个正整数(甚至可能是1个),只要这些数的和等于n即可。
但是,有一个额外的限制,填入的所有数必须小于等于k,大于等于1,填入的数的最大值必须大于等于d。
请你计算,有多少个不同的等式满足这些限制。由于答案可能很大,请将答案mod(998244353)后输出。
输入描述
输入包含三个数n,k,d(1≤d≤k≤n≤1000)
输出描述
输出包含一行,即方案数。
样例输入
5 3 2
样例输出
12
#美团##笔试题目#
全部评论
贴一下我做的dp的答案把 while(sc.hasNext()){             n=sc.nextInt();             k=sc.nextInt();             d=sc.nextInt();             ans=0;             /*backtrack(0,0);             System.out.println(ans);*/             int[][] dp=new int[n+1][2];             for (int i = 0; i < d; i++) {                 dp[i][1]=0;             }             dp[1][0]=1;             dp[0][0]=1;             for (int i = 2; i <= n; i++) {                 for (int j = 1; j <= k; j++) {                     if(i-j<0)continue;                     if(j<d) {                         dp[i][0]+=dp[i-j][0];                         dp[i][1] += dp[i - j][1];                     }                     else {                         dp[i][1] +=dp[i - j][1] + dp[i - j][0];                     }                 }             }             System.out.println(dp[n][1]);         }
1 回复 分享
发布于 2020-09-13 13:45
'只适用于Python,过了本地测试&(10111)#39; n, k, d = [int(i) for i in input().strip().split(' &(5528)#39;)] res = [] count = 0 ' 排列&#39; def A(n, m):     res = 1     for i in range(m, m-n, -1):         res *= i     return res '计算数组有多少种排列组合&(10110)#39; def c(arr):     a_dict = {}     for i in arr:         if i in a_dict.keys():             a_dict[i] += 1         else:             a_dict[i] = 1     l = len(arr)     res = A(l, l)     for i in a_dict.values():         res //= A(i, i)     return res " 依次获取所有的组合,但没有排列,用函数c计算每种有多少种排列" def f(rest, start, res):     global count     for i in range(start, rest+1):         if rest == i:             count = (count+c(res+[i])) % 998244353         if i == res[0]:             break         f3(rest-i, start=i, res=res+[i]) for i in range(d, k+1):     f3(n-i, 1, res=[i]) print(count)
点赞 回复 分享
发布于 2020-09-14 19:04
import java.util.*; public class Main {  static int count=0;  public static void main(String[] args) {  Scanner sc=new Scanner(System.in);  while(sc.hasNext()) {      int n=sc.nextInt();  int k=sc.nextInt();  int d=sc.nextInt();  gg(n,d,0,k,0);  System.out.println(count);  }    }  public static void gg(int n,int d,int sum,int index,int max) {  if(n==sum) {    if(max>=d){ count++;        }  return;  }  int t=max;  for(int i=index;i>=1;i--) {  if(sum+i>n) {  continue;  }  if(i>max) {     max=i;  }  gg(n,d,sum+i,index,max);  max=t;    }    } }
点赞 回复 分享
发布于 2020-09-13 13:21
用两个dp数组或者一个二维的数组,计算不含大于等于d的方案数量和含有大于等于d的方案数量
点赞 回复 分享
发布于 2020-09-13 12:42
我看到有dfs剪枝不超时的,用的java
点赞 回复 分享
发布于 2020-09-13 12:39
看起来像个dp啊。 考虑dp[S][0/1]表示拼成S的时候是否使用了超过d的数,然后考虑状态转移即可。 时间复杂度是O(N*K)的。
点赞 回复 分享
发布于 2020-09-13 12:39

相关推荐

喵_coding:年底缺人是短视频营造出来的 而且一般说的也很宽泛 不是特指后端
点赞 评论 收藏
分享
2025-12-02 02:15
门头沟学院
最近菊厂陆续开了,极力劝退那些拿13级的985硕士,就13级那么点儿薪资,一线城市每个月到手1.8/7/6w,租房2k还是破烂,吃饭2k还是预制菜,买个1k衣服都是聚酯纤维破塑料,稍微出去浪一浪,能留1w就是万岁,要是再有个啥都想买的对象,一线工作一年难存10w。隔壁工地混泥土,钳工,焊工一天800+,还包吃包住。读书18年到985硕士出来就为了进厂螺丝工?还不如从8岁童工开始干活,别人读书完了你工龄18+,混不上领导也是个小头头了。当然专科进来正式工,od都行,一般本科进来13级也OK,毕竟22岁年纪摆在那个地方还不需要太花钱。读硕博的基本26岁,工作两年就要结婚的,兜里没几个崽,连彩礼都要信用贷。菊厂离职的不少,毕竟正常没人受得了9116(梗:再来一次911刷6)。为啥这时候劝?因为刚下班,因为国考刚完,省考下周,就是可惜选调只有当年应届能报。现在回想能拍断大腿。应届生真实好身份,错过这一次,选调,考公,考编,当老师,进医院,研究所,高校,央国企,基本都无缘了,就连报名资格都被剥夺了,可谓是被党和国家遗弃的废材,统称“社会上的”,扔到社会去流浪,被用坏了就扔医院,长期超负载使用,零件修不好基本可以扔火里回炉重造了。体制内奉行找体制内的,都是党和国家选的人才,智力不差,样貌不丑,身材端正,收入稳定,安居房政策福利待遇也OK。因公出行都是报销,周末顺带“游山玩水“,这种体制内单身资源但凡想找对象,去社会上随便吆喝一声都排队。观察一下,基本没什么公务员在相亲,因为早就被邻里邻居抢光了。
哈哈哈,你是老六:就这不去的人大把人干呢,现在不缺人干活,你不干大把干呢,还有那个说农民工赚钱的,那个800+我估计肯定也就那一段时间,哪有这么赚钱,还是一句话,要想存下钱必须花销极低,能省的就不花钱,工资要高点
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务