[AcWing] 900. 整数划分(C++实现)计数类dp例题
1. 题目
2. 读题(需要重点注意的东西)
思路:
闫式dp分析法
用闫式dp分析法分析整数划分问题
3. 解法
---------------------------------------------------解法1:优化前---------------------------------------------------
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010, mod = 1e9 + 7;
int n;
int f[N][N];
int main()
{
cin >> n;
for(int i = 0;i <= n;i++) f[i][0] = 1;
for (int i = 1; i <= n; i ++ )
for(int j = 0; j <= n; j ++ ){
f[i][j] = f[i-1][j]; // j < i ,一个i都放不下的情况
// j >= i的情况
if(j >= i) f[i][j] = (f[i - 1][j] + f[i][j - i]) % mod;
}
cout << f[n][n] << endl;
return 0;
}
优化的思路同完全背包问题(优化成一维)
---------------------------------------------------解法2:优化后---------------------------------------------------
#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;
}
可能存在的问题
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
- 动态规划
- 计数类dp
- 完全背包问题
6. 总结
计数类dp的例题,理解思想并自行推导出代码。