HDU acm1028 整数划分 递归问题(递推)
2024-08-24 17:28:27
我们用递归+记忆化的方法来解决普通整数划分问题:定义 f(n,m)为将整数n划分为一系列整数之和,其中加数
最大不超过m。
得到下面的递推关系式:
当n==1 || m==1 只有一种划分,即 1 或者 1+1+1......+1
当m>n 显然,等价于 f(n,n)
当m==n 此时:我考虑加数包含m与否的两种情况:
1)划分不包含m,即f(n,m-1)---所有m-1的划分
2)划分包含 m,此时只有一种即 m
所以当m==n时,有 f(n,m)=f(n,m-1)+1
当m<n时,
1)包含m时,{m,x1,x2,x3....xi}此时 等价于 f(n-m,m)
2)不包含m时,显然f(n,m-1)
所以f(n,m)=f(n,m-1)+f(n-m,m)
采用记忆化技术优化复杂度:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 130
int num[MAXN][MAXN];
int dp(int n,int k)
{
if(n==||k==)
return ;
if(k>n)
{
k=n;
if(num[n][n]==-)
return num[n][n]=dp(n,n);
else
return num[n][n];
}
else if(k==n)
{
if(num[n][k]==-)
return num[n][k]=dp(n,k-)+;
else
return num[n][k];
}
else
{
if(num[n][k]==-)
return num[n][k]=dp(n,k-)+dp(n-k,k);
else
return num[n][k];
}
}
int main()
{
int n;
while(cin>>n)
{
memset(num,-,sizeof(num));
cout<<dp(n,n)<<endl;
}
return ;
}
最新文章
- jira操作
- centos install zookeeper cluster
- 搭建openvpn 未完成。。。
- android之OptionsMenu
- DataGridView减少闪烁的解决办法
- 关于将客户端移植到Lua的解决方案设想。
- Mysql优化之创建高性能索引(二)
- Swift 求余运算
- 手机访问pc地址时直接跳到移动端
- Extjs中数据导出到Excel
- 注解 - Excel 校验工具
- (Dijkstra) POJ2387 Til the Cows Come Home
- Java Deque 队列 栈
- BASEDIR
- android_双击退出
- day_6.6 py
- 记一次挂马清除经历:处理一个利用thinkphp5远程代码执行漏洞挖矿的木马
- 008-jdk1.7版本新特性
- PHPEmailer使用简介(以qq邮箱为例)
- beta冲刺(6/7)
热门文章
- java.lang.String中的trim()方法的详细说明(转)
- mysql的安装、C++訪问mysql数据库、编码设置问题
- 一个IP绑定多个域名
- iterm2 配色
- C语言-回溯例4
- android中的MD5、Base64、DES/3DES/ADES加解密
- ruby on rails模拟HTTP请求错误发生:end of file reached
- hdu5317 RGCDQ 统计
- Graphics and Animation in iOS
- 2251: [2010Beijing Wc]外星联络