bzoj1037生日聚会

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

任意区间的话,可以从所有后缀区间考虑。

  因为每一个区间一定是某一时刻的一个后缀区间,所以只要每一时刻的后缀区间均合法,就行了。

当然有状态是几个男孩、几个女孩,还可以记录状态:最大的男孩减女孩的差 和 最大的女孩减男孩的差,这样就能转移了。

没错,只要关注后缀区间就行了!所以是max(0,u-1)而不是维持u不变!(当它是负数的时候就不用管了,因为已经且仅体现在另一维中)

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=155,K=25;
const ll mod=12345678;
int n,m,k;
ll dp[N][N][K][K],ans;
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    dp[0][0][0][0]=1;
    for(int i=0;i<=n;i++)
        for(int j=0;j<=m;j++)
            for(int u=0;u<=k;u++)
                for(int v=0;v<=k;v++)
                {
                    (dp[i+1][j][u+1][max(0,v-1)]+=dp[i][j][u][v])%=mod;
                    (dp[i][j+1][max(0,u-1)][v+1]+=dp[i][j][u][v])%=mod;
                }
    for(int u=0;u<=k;u++)for(int v=0;v<=k;v++)(ans+=dp[n][m][u][v])%=mod;
    printf("%lld",ans);
    return 0;
}

 

posted on 2018-06-04 15:12  Narh  阅读(91)  评论(0编辑  收藏  举报

导航