1259 整数划分 V2

Posted 声声醉如兰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1259 整数划分 V2相关的知识,希望对你有一定的参考价值。

设dp[n]为整数n的分割函数,由五边形定理得到:

dp[n] = dp[n-1] + dp[n-2] - dp[n-5] - dp[n-7]……

我们将其分为两部分计算

第一部分为 :( dp[n-1] - dp[n-5] …… ) 奇数项为加,偶数项为减,第j项括号内的值为 : n-(j*(3*j-1)/2)

第二部分为:(dp[n-2] - dp[n-7]……)  奇数项为加,偶数项为减,第j项括号内的值为 : n-(j*(3*j+1)/2)

如此递推便可求出n的分割函数 dp[n]

 

技术分享
#include <iostream>
#include <cmath>
#include <string.h>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
#define LL long long
#define MAXSIZE 1000005
#define INF 1e11

const LL mod=1e9+7;

LL dp[MAXSIZE];

LL Solve(int n)
{
    dp[0] = 1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j*(3*j-1)/2<=i;j++)
        {
            if(j&1)
                dp[i] = (dp[i] + dp[i-(j*(3*j-1)/2)] + mod)%mod;
            else
                dp[i] = (dp[i] - dp[i-(j*(3*j-1)/2)] + mod)%mod;
        }

        for(int j=1;j*(3*j+1)/2<=i;j++)
        {
            if(j&1)
                dp[i] = (dp[i] + dp[i-(j*(3*j+1)/2)] + mod)%mod;
            else
                dp[i] = (dp[i] - dp[i-(j*(3*j+1)/2)] + mod)%mod;
        }
    }
    return dp[n];
}

int main()
{
    int n;
    scanf("%d",&n);
    LL ans = Solve(n);
    printf("%lld\n",ans);
    return 0;
}
View Code

 

以上是关于1259 整数划分 V2的主要内容,如果未能解决你的问题,请参考以下文章

数的划分终极版--背包法解决各类数的划分

51nod 1053 最大M子段和 V2

如何在地图片段 API v2 布局顶部添加按钮

2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试

1259:例9.3求最长不下降序列

如何使用 xcode 将快照划分为多个片段,以便让用户与每个片段进行交互?