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; }
以上是关于1259 整数划分 V2的主要内容,如果未能解决你的问题,请参考以下文章
2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试