题目链接:https://nanti.jisuanke.com/t/33656
dp[i][j]代表用j个数字分解数字i,再枚举从1到i的每个数字进行转移
#include<bits/stdc++.h>
using namespace std;
long long dp[40][40][40],sum[40][40],ans[40];
int main()
{
int p;
scanf("%d",&p);
while(p--)
{
memset(dp,0,sizeof(dp));
memset(sum,0,sizeof(sum));
memset(ans,0,sizeof(ans));
int K,n,m,k;
scanf("%d%d%d%d",&K,&n,&m,&k);
int a[40]={0};
for(int i=m;i<=35;i+=k)
a[i]=1;
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
dp[0][j][k]=0;
sum[0][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
for(int k=1;k<=i;k++)
{
if(a[k]==1)
continue;
dp[i][j][k]+=sum[i-k][j-1];
// printf("dp[%d][%d][%d]=%lld\n",i,j,k,dp[i][j][k]);
sum[i][j]+=dp[i][j][k];
}
ans[i]+=sum[i][j];
// printf("sum[%d][%d]=%lld\n",i,j,sum[i][j]);
}
}
printf("%d %lld\n",K,ans[n]);
}
return 0;
}
本文详细解析了一个关于数字分解的动态规划(DP)算法题。通过使用三维DP数组来记录状态,算法实现了对特定条件下数字分解组合的计数。文章通过具体的代码示例,展示了如何初始化DP数组,进行状态转移,以及最终结果的计算。

被折叠的 条评论
为什么被折叠?



