Algorithm2.6 计数dp

[TOC]

计数dp

典型:

  • 对一个区域进行划分,划分种类
    • 随意划分:P1025,直接给定一个数以及要划分的份数,然后看这个数有多少种分法
    • 按照给定的要求划分:P1077,直接卡死了每一个点上的约定范围
    • 按照递增/递减的方式划分:P1806,直接按照递增着划分

随意划分

https://www.luogu.com.cn/problem/P1025

按照给定要求划分

https://www.luogu.com.cn/problem/P1077

递增/递减划分

https://www.luogu.com.cn/problem/P1806

每一步都有可能是从任意之前的某一步跳过来的,因为只要保证递增就好了。也就是第一次是1次,那么第2次必定第一次的次数递增上来,那么第三次必定包括第一次和第二次递增上来。

=>每次只需要把自己前面所有的点的值都加起来即可

#include <iostream>
using namespace std;
typedef long long ll;
const int maxn = 509;
ll n, dp[maxn];

int main() {
    scanf("%lld", &n);
    dp[0] = 1;
    for (int i = 1; i <= n; ++i)
        for (int j = n; j >= i; --j)
            dp[j] += dp[j-i];
        printf("%lld\n", dp[n]-1);
    return 0;
}
Posted on Feb 1, 2021