bzoj 3612 [Heoi2014]平衡——整数划分(dp)

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3612

因为力矩的缘故,变成了整数划分。

学习到了整数划分。就是那个图一样的套路。https://blog.csdn.net/Vmurder/article/details/42551603

注意各种边界。

注意输出换行。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=90005;
int T,n,k,p,dp[N][15],ans;
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        memset(dp,0,sizeof dp);ans=0;dp[0][0]=1;
        scanf("%d%d%d",&n,&k,&p);int lm=n*(k-1);
        for(int i=1;i<=lm;i++)
            for(int j=1;j<=k;j++)
            {
                if(i>=j)(dp[i][j]+=dp[i-j][j]+dp[i-j][j-1])%=p;//注意if 
                if(i>n)dp[i][j]=((dp[i][j]-dp[i-(n+1)][j-1])%p+p)%p;
            }
        for(int i=1;i<=lm;i++)
            for(int j=1;j<=k;j++)
                (ans+=dp[i][j]*dp[i][k-j])%=p;
        for(int i=0;i<=lm;i++)    //0
            for(int j=0;j<k;j++)    //0
                (ans+=dp[i][j]*dp[i][k-1-j])%=p;
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Narh/p/9197750.html