前言
复习acwing算法基础课的内容,本篇为讲解基础算法:动态规划——计数类DP,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
一、动态规划
动态规划(Dynamic Programming,DP)是求解决策过程最优化的过程,个人认为是目前接触的所有算法里最绕的…
这里的题目的解题方法来自于:y总的闫氏dp分析法
二、AcWing 900. 整数划分
本题链接:AcWing 900. 整数划分
本博客提供本题截图:
本题解析
两种分析方法:
①当做一个完全背包问题去理解:
看成为一个容量为n
的背包,然后有体积1 2 3 ... n
这么n
种不同的物品,每件物品有无限个,问恰好装满整个背包且背包中物品不完全相同的个数
同样我们用完全背包问题的优化:
②来自y总奇奇妙妙的划分法
①AC代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010, mod = 1e9 + 7;
int n;
int f[N];
int main()
{
cin >> n;
f[0] = 1;
for (int i = 1; i <= n; i ++ )
for (int j = i; j <= n; j ++ )
f[j] = (f[j] + f[j - i]) % mod;
cout << f[n] << endl;
return 0;
}
②AC代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010, mod = 1e9 + 7;
int n;
int f[N][N];
int main()
{
cin >> n;
f[1][1] = 1;
for (int i = 2; i <= n; i ++ )
for (int j = 1; j <= i; j ++ )
f[i][j] = (f[i - 1][j - 1] + f[i - j][j]) % mod;
int res = 0;
for (int i = 1; i <= n; i ++ ) res = (res + f[n][i]) % mod;
cout << res << endl;
return 0;
}
三、时间复杂度
关于动态规划——计数类DP的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。