zoukankan      html  css  js  c++  java
  • 记忆化搜索模板题---leetcode 1155. 掷骰子的N种方法

    1155. 掷骰子的N种方法

    这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, ..., f

    我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和。

    如果需要掷出的总点数为 target,请你计算出有多少种不同的组合情况(所有的组合情况总共有 f^d 种),模 10^9 + 7 后返回。

    示例 1:

    输入:d = 1, f = 6, target = 3
    输出:1
    

    示例 2:

    输入:d = 2, f = 6, target = 7
    输出:6
    

    示例 3:

    输入:d = 2, f = 5, target = 10
    输出:1
    

    示例 4:

    输入:d = 1, f = 2, target = 3
    输出:0
    

    示例 5:

    输入:d = 30, f = 30, target = 500
    输出:222616187

    提示:

    • 1 <= d, f <= 30
    • 1 <= target <= 1000

    因为自己动态规划学的不好,所以用记忆化搜索来做的

    class Solution {
        int dp[35][1050];//计算结果
        int vis[35][1050];//标记是否已经进行了计算
        int F;
        int mod = 1e9+7;
        
    public:
        int DFS(int d,int tar){ //第d次选择,剩余tar
            if(d>tar) return 0;
            if(d ==0){
                if(tar == 0) return 1;
                else return 0;
            }
            if(vis[d][tar]>0) return dp[d][tar]; //如果已经进行了计算,就返回结果
            int ans = 0;
            for(int i =1;i<=F && i<=tar;i++){
                ans+=DFS(d-1,tar-i); //
                ans%=mod;
            }
            vis[d][tar] = 1;//已经算出了结果,做一个标记
            return dp[d][tar] = ans;//记忆化
        }
        
        
        int numRollsToTarget(int d, int f, int target) {
            F = f;
            return DFS(d,target);
        }
    };
  • 相关阅读:
    Android(java)学习笔记6:实现Runnable接口创建线程 和 使用Callable和Future创建线程
    Android(java)学习笔记5:线程的生命周期
    Android(java)学习笔记4:线程的控制
    Android(java)学习笔记3:线程的优先级
    Android(java)学习笔记2:继承Thread类创建线程类
    凑算式
    三洋献瑞
    三洋献瑞
    三洋献瑞
    移动距离
  • 原文地址:https://www.cnblogs.com/bigbrox/p/11337143.html
Copyright © 2011-2022 走看看