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; }