1. 程式人生 > >BZOJ P1037 [ZJOI2008]生日聚會Party【動態規劃】

BZOJ P1037 [ZJOI2008]生日聚會Party【動態規劃】

簡單四維DP:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define rep(i,x,y) for(ll i=(x);i<=(y);i++)
#define repl(i,x,y) for(ll i=(x);i<(y);i++)
#define repd(i,x,y) for(ll i=(x);i>=(y);i--)
using namespace std;

const ll N=155;
const ll M=25;
const ll Mod=12345678;

ll n,m,t,ans,f[N][N][M][M];

inline ll read() {
	ll x=0;char ch=getchar();bool f=0;
	while(ch>'9'||ch<'0'){if(ch=='-')f=1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return f?-x:x;
}

inline ll add(ll x,ll y) { return x+y>=Mod?x+y-Mod:x+y;}

int main() {
	n=read(),m=read(),t=read();
	
	f[0][0][0][0]=1;
	
	rep(i,0,n) rep(j,0,m) rep(a,0,t) rep(b,0,t) {
		f[i+1][j][a+1][b>0?b-1:0]=add(f[i+1][j][a+1][b>0?b-1:0],f[i][j][a][b]);
		f[i][j+1][a>0?a-1:0][b+1]=add(f[i][j+1][a>0?a-1:0][b+1],f[i][j][a][b]);
	}
	
	rep(i,0,t) rep(j,0,t) ans=add(ans,f[n][m][i][j]);
	
	printf("%lld",ans);
	
	return 0;
}