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
看起来像个dp啊。 考虑dp[S][0/1]表示拼成S的时候是否使用了超过d的数,然后考虑状态转移即可。 时间复杂度是O(N*K)的。
点赞 回复 分享
发布于 2020-09-13 12:39
我看到有dfs剪枝不超时的,用的java
点赞 回复 分享
发布于 2020-09-13 12:39
用两个dp数组或者一个二维的数组,计算不含大于等于d的方案数量和含有大于等于d的方案数量
点赞 回复 分享
发布于 2020-09-13 12:42
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
'只适用于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

相关推荐

不愿透露姓名的神秘牛友
10-03 18:53
已编辑
歌尔股份 软件研发岗 14K×14薪 硕士211
给你点了个赞的打工鸭很忙碌:校友那个专业的呢?聊聊吗?我电科的
点赞 评论 收藏
分享
评论
1
2
分享
牛客网
牛客企业服务