当前位置:网站首页>数的划分之动态规划
数的划分之动态规划
2022-08-04 04:53:00 【一个山里的少年】
1.对应OJ链接:
2.题目描述:
3.解题思路:
方法一:直接暴力递归
从index位置开始进行尝试一直到n,具体请看代码。
对应代码:
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int 被划分的数 * @param k int 化成k份 * @return int */ int divideNumber(int n, int k) { // write code here return process(n, k, 1); } //递归含义:从index位置开始将n划分成k分的方法数 int process(int n, int k, int index) { if (k < 0) { return 0; } //如果剩下了0分那么只有当k为0时有一种划分结果 if (k == 0) { return n == 0 ? 1 : 0; } int ways = 0; for (int i = index; i <= n; i++) { //尝试i位置上的数 ways += process(n - i, k - 1, i); } return ways; } };
但是很不幸的是这种方法即使改成记忆化搜索和dp依然会超时。下面我们来看下面一种方法。感觉特别的妙:
我们可以将k想象成有k个盒子按照题目的意思就是每个盒子不能为空,那么我们可以提前给每个盒子都放入一个1这样一来盒子就不会是空的了。然后我们再将剩下的n-k个小球再放到k个盒子里面即可,此时就有多种可能性了 n-k个小球可以放到第一个盒子中,可以放到1和2这两个盒子当中也可以放到1到3这三个盒子当中,也可以放到1到k这些盒子当中。
对应代码:
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int 被划分的数 * @param k int 化成k份 * @return int */ vector<vector<int>>dp; int mod=1000000000+7; int divideNumber(int n, int k) { // write code here // dp.resize(n+1,vector<vector<int>>(k+1,vector<int>(n+1,-1))); dp.resize(n+1,vector<int>(k+1,-1)); return process(n,k); } //将n划分成k分的方法数 int process(int n,int k) { if(n==k){ return 1; } if(k>n){ return 0; } if(dp[n][k]!=-1){ return dp[n][k]; } int ways=0; //剩下的n-k个小球放到k个盒子里面的可能性进行枚举 for(int i=1;i<=k;i++){ ways=(ways+process(n-k,i))%mod; } dp[n][k]=ways; return ways; } };
斜率优化:
对应代码:
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int 被划分的数 * @param k int 化成k份 * @return int */ vector<vector<int>>dp; int mod=1000000000+7; int divideNumber(int n, int k) { // write code here // dp.resize(n+1,vector<vector<int>>(k+1,vector<int>(n+1,-1))); dp.resize(n+1,vector<int>(k+1,-1)); return process(n,k); } //将n划分成k分的方法数 int process(int n,int k) { if(k==0){ return n==0?1:0; } if(k==n){ return 1; } if(k>n){ return 0; } if(dp[n][k]!=-1){ return dp[n][k]; } int ways=process(n-1,k-1); ways=(ways+process(n-k,k))%mod; dp[n][k]=ways; return ways; } };
边栏推荐
- 【SemiDrive源码分析】【MailBox核间通信】47 - 分析RPMSG_IPCC_RPC 方式 单次传输的极限大小 及 极限带宽测试
- 基于gRPC编写golang简单C2远控
- 系统设计.秒杀系统
- C Expert Programming Chapter 4 The Shocking Fact: Arrays and Pointers Are Not the Same 4.3 What is a Declaration and What is a Definition
- 2022软件测试面试题 最新字节跳动50道真题面试题 刷完已拿下15k 附讲解+答疑
- 深度学习环境配置
- 【一步到位】Jenkins的安装、部署、启动(完整教程)
- 解决问题遇到的问题
- C专家编程 第4章 令人震惊的事实:数组和指针并不相同 4.3 什么是声明,什么是定义
- C专家编程 第5章 对链接的思考 5.4 警惕Interpositioning
猜你喜欢
深度学习环境配置
Enterprise live broadcast is on the rise: Witnessing focused products, micro-like embracing ecology
8.Haproxy 搭建Web集群
3000字,一文带你搞懂机器学习!
See how DevExpress enriches chart styles and how it empowers fund companies to innovate their business
Towards Real-Time Multi-Object Tracking(JDE)
Take care of JVM performance optimization (own note version)
八年软件测试工程师带你了解-测试岗进阶之路
The video of machine learning to learn [update]
【流程图】
随机推荐
使用serve搭建本地服务器
Large chain best freight d audit with what software?What are the functions?
深度学习21天——卷积神经网络(CNN):实现mnist手写数字识别(第1天)
3000字,一文带你搞懂机器学习!
10 Convolutional Neural Networks for Deep Learning 3
Tensors - Application Cases
路网编辑器技术预研
XSS related knowledge points
How to systematically plan and learn software testing?
SVM介绍以及实战
数据治理平台项目总结和分析
Chapter 5 C programming expert thinking 5.4 alert Interpositioning of links
TL431的基本特性以及振荡电路
技术解析|如何将 Pulsar 数据快速且无缝接入 Apache Doris
【21天学习挑战赛】直接插入排序
7-3 LVS+Keepalived集群叙述与部署
Learn iframes and use them to solve cross-domain problems
How to simplify the automation of modern e-procurement?
Enterprise live broadcast is on the rise: Witnessing focused products, micro-like embracing ecology
Use serve to build a local server